2017-07-22 15 views
2

私はWindowsドライバーを試していて、Microsoftのドライバーコードの例(正確にはMinispy)で作業しています。残念ながら、私はC++や特にドライバー開発の新人です。WDK:PVCHIDをPWCHARにキャストする(CからC++への変換)

CHAR buffer[1024]; 
PINSTANCE_FULL_INFORMATION data = (PINSTANCE_FULL_INFORMATION)buffer; 

hResult = FilterVolumeInstanceFindFirst(VolumeName, 
     InstanceFullInformation, 
     data, 
     sizeof(buffer) - sizeof(WCHAR), 
     &bytesReturned, 
     &volumeIterator); 

PWCHAR filtername = PVOID(PUCHAR(data) + data->FilterNameBufferOffset); 
filtername[data->FilterNameLength/sizeof(WCHAR)] = L'\0'; 

if (_wcsicmp(filtername, MINISPY_NAME) == 0) { ... 

このコードの一部は、C2440コンパイラエラーを提供します:(ほとんどの部分は今では非常にうまく機能する)C++にCからユーザーモードアプリケーションを翻訳しながら

は、私が面白いキャストに遭遇することはできませんPVOIDからPWCHARに変換する:

filtername = PVOID(PUCHAR(data) + data->FilterNameBufferOffset); 

コードはCで完璧にうまくいきましたが、C++はPWCHARにそのボイドポインタ「アレイ」を投影しません。

私は数時間試しましたが、うまく動作しませんでした。何か案は?

多くの感謝!参考のため

PINSTANCE_FULL_INFORMATION構造体:

https://msdn.microsoft.com/de-de/library/ff548185(v=vs.85).aspx

コンパイラエラーC2440:

https://msdn.microsoft.com/en-us/library/sy5tsf8z.aspx

+1

もちろん、 'PVOID'は* C++ *の' PWCHAR'変数に代入することはできません。 'PWCHAR filtername =(PWCHAR)(PUCHAR(data)+ data-> FilterNameBufferOffset);'(PWSTR)RtlOffsetToPointer(data、data-> FilterNameBufferOffset) ' – RbMm

答えて

2

必要なのはこれです:

PWCHAR filtername = PWCHAR(PUCHAR(data) + data->FilterNameBufferOffset); 

なぜなら、Cではvoid*を暗黙的にキャストでき、C++ではキャストするとvoid*が明示的でなければならないからです。

だから、これは実際には見過ごさ行ったオリジナルのCコードのわずかな間違いだった:著者はPVOIDPUCHARをキャストし、その後PWCHARにそれを割り当てました。 PVOIDを何かにキャストすることは暗黙的に行うことができるので、Cコンパイラは気にしませんでした。 C++コンパイラは、PVOIDPWCHARにさらにキャストする必要があります。しかし、最初にPVOIDにキャスティングする必要はありませんでした。中間キャストを使わずにPUCHARPWCHARにキャストするだけで、PVOIDにキャストすることができます。

+0

と言っていました。ただ、私の一日を救った! :) –