2017-08-20 11 views
0

私は私のドライバに渡したい単純な構造体を持っています。ここでは構造体は次のとおりです。IOCTL Driver SystemBuffer常にNULL

DWORD dwReturn; 
readStruct reader{ ... }; 

WriteFile(hDriver, (LPCVOID)&reader, sizeof(ReadStruct), &dwReturn, NULL); 

ここに私のドライバのコードがあり、それは常にreadStructにNULLを返します:

typedef struct readStruct 
{ 
    ... 
} ReadStruct, *pRreadStruct; 

は、ここに私のユーザーモードアプリケーションです。私は間違って何をしていますか?

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

あなたはデバイスでバッファリングされたioですか? 'DO_BUFFERED_IO'フラグをセットしましたか?この場合のみ、 'AssociatedIrp.SystemBuffer'はユーザバッファを指します。また、 'IRP_MJ_WRITE'は' IRP_MJ_DEVICE_CONTROL'ではありません - あなたのヘッダ(問題の)が実際の質問 – RbMm

+0

と 'IRP_MJ_WRITE'にマッチしないようになっています - ** Irp-> AssociatedIrp.SystemBuffer ** システム提供バッファへのポインタ** DO_BUFFERED_IO **フラグが** DeviceObject-> Flags **に設定されている場合、中間システムバッファとして使用します。それ以外の場合、このメンバーはNULLに設定されます。 – RbMm

+0

C++で構造体をtypedef'ingするのはなぜですか?これで、すべて同じ型を参照する3つの名前( 'struct readStruct'、' readStruct'、 'ReadStruct')があります。また、typedefの背後にポインタを隠すことを強くお勧めします(そして、pR ** r ** eadStructのスペルが間違っています)。 – melpomene

答えて

0

DO_BUFFERED_IOフラグがDeviceObject->国旗にDriverEntryに設定する必要があります。

これを指摘するユーザー@RbMmに感謝します。