0
Ich habe eine einfache Struktur, die ich an meinen Treiber übergeben möchte. Hier ist die Struktur:IOCTL Treiber SystemBuffer immer NULL
typedef struct readStruct
{
...
} ReadStruct, *pRreadStruct;
Hier ist meine Usermode Anwendung:
DWORD dwReturn;
readStruct reader{ ... };
WriteFile(hDriver, (LPCVOID)&reader, sizeof(ReadStruct), &dwReturn, NULL);
Hier ist mein Treibercode, es gibt immer NULL zum readStruct. Was mache ich falsch?
PIO_STACK_LOCATION pIoStackIrp = NULL;
pRreadStruct readStruct;
pIoStackIrp = IoGetCurrentIrpStackLocation(Irp);
DbgPrintEx(0, 0, "WriteBufferedIO\n");
if (pIoStackIrp)
{
readStruct = (pRreadStruct)Irp->AssociatedIrp.SystemBuffer;
if (readStruct)
{
// this is the place I never get into
if (readStruct->ReadSize)
{
ReadMemOutputClient(readStruct);
}
}
}
werden Sie Gerät gepuffert io verwendet? Sie setzen 'DO_BUFFERED_IO' Flag? nur in diesem Fall wird 'AssociatedIrp.SystemBuffer' auf den Benutzerpuffer zeigen. auch 'IRP_MJ_WRITE' dies ist nicht 'IRP_MJ_DEVICE_CONTROL' - also ist Ihre Kopfzeile (in Frage) nicht passend echte Frage – RbMm
für' IRP_MJ_WRITE' - ** Irp-> AssociatedIrp.SystemBuffer ** Zeiger auf einen vom System gelieferten Puffer zu verwenden als Zwischensystempuffer, wenn das ** DO_BUFFERED_IO ** Flag in ** DeviceObject-> Flags ** gesetzt ist. Andernfalls wird dieses Mitglied auf NULL festgelegt. – RbMm
Warum schreiben Sie Strukturen in C++? Jetzt haben Sie drei Namen ('struct readStruct',' readStruct', 'ReadStruct'), die alle auf den gleichen Typ verweisen. Außerdem empfehle ich dringend, hinter typedefs Zeiger zu verstecken (und pR ** r ** eadStruct ist falsch geschrieben). – melpomene