2017-08-20 5 views
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); 
     } 
    } 
} 
+1

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

+0

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

+0

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

Antwort

0

DO_BUFFERED_IO Flagge sollte in DeviceObject-> Flaggen in Driver eingestellt werden.

Dank Benutzer @ RbMm für das hinweisend.