Я пытаюсь узнать больше о DriverKit и управлении памятью, и я прочитал этот вопрос:
Как выделить память в системном расширении DriverKit и сопоставить ее с другим процессом?
И я хотел бы понять, как использовать IOMemoryDescriptor::CreateMapping
.
Я написал небольшое приложение, чтобы проверить это там, где я это делаю (очень упрощенный код):
uint8_t * buffer = new uint8_t[256];
for (int i = 0 ; i < 256 ; i++)
buffer[i] = 0xC6;
clientData in, out;
in.nbytes = 256;
in.pbuffer = buffer;
size_t sout = sizeof(out);
IOConnectCallStructMethod(connection, selector,&in,sizeof(in),&out,&sout);
// out.pbuffer now has new values in it
В моем пользовательском клиентском классе Kext я делал (упрощаю):
IOReturn UserClient::MyExtFunction(clientData * in, clientData * out, IOByteCount inSize, IOByteCount * outSize)
{
MyFunction(in->nBytes, in->pbuffer);//this will change the content of pbuffer
*out = *in;
}
IOReturn UserClient::MyFunction(SInt32 nBytesToRead,void* pUserBuffer,SInt32* nBytesRead)
{
PrepareBuffer(nBytesToRead,&pBuffer);
...
(call function that will fill pBuffer)
}
IOReturn UserClient::PrepareBuffer(UInt32 nBytes,void** pBuffer);
{
IOMemoryDescriptor * desc = IOMemoryDescriptor::withAddressRange((mach_vm_address_t)*pBuffer,nBytes,direction, owner task);
desc->prepare();
IOMemoryMap * map = desc->map();
*pBuffer = (void*)map->getVirtualAddress();
return kIOReturnSuccess;
}
Это то, что я не знаю, как воспроизвести в DExt, и где, как мне кажется, я действительно не понимаю основ CreateMapping
.
Или то, что я раньше делал, невозможно?
В моем драйвере я не знаю, как использовать CreateMapping
и IOMemoryMap
, чтобы этот буфер можно было сопоставить с областью памяти и обновить с помощью других значений.
Я могу создать IOBufferMemoryDescriptor
, но как мне привязать его к буферу из моего приложения? Я также не понимаю различных вариантов CreateMapping
.
Обратите внимание, что в другом тестовом приложении я успешно использовал _9 _ / _ 10_, но я хотел бы узнать конкретно о CreateMapping ().
(Надеюсь, все в порядке, я много редактировал этот вопрос ... все еще новичок в StackOverflow)