私はC#でUSBモニターに取り組んでおり、システムドライバーが到着を処理して到着したデバイスを有効にした後に反応できるようにしたかったのですが、アプリケーションレベルのプロセス(エクスプローラー)よりも高速でした。autorun.inf のデバイスを調べて、到着を拒否することがわかった場合。MSDN で説明されているように BROADCAST_QUERY_DENY を使用しましたが、成功しませんでした。コードは次のとおりです(USBが「I」ドライブとして到着すると仮定):
switch (msg.Msg)
{
case Win32CODES.WM_DEVICECHANGE:
{
if (msg.LParam != IntPtr.Zero)
{
DEV_BROADCAST_HDR pHdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(msg.LParam, typeof(DEV_BROADCAST_HDR));
switch ((int)msg.WParam)
{
case Win32CODES.DBT_DEVICEARRIVAL:
{
if (pHdr.dbch_devicetype == Win32CODES.DBT_DEVTYP_VOLUME)
{
DEV_BROADCAST_VOLUME pVol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(msg.LParam, typeof(DEV_BROADCAST_VOLUME));
Char c = GetDriveLetter(pVol.dbcv_unitmask);
if (c == 'I')
{
msg.Result = new IntPtr(Win32CODES.BROADCAST_QUERY_DENY );
base.WndProc(ref msg);
return;
}
}
break;
}
}
}
break;
}
}
base.WndProc(ref msg);
}
その後、別の方法を試しましたが、やはり成功しませんでした。
switch (msg.Msg)
{
case Win32CODES.WM_DEVICECHANGE:
{
if (msg.LParam != IntPtr.Zero)
{
DEV_BROADCAST_HDR pHdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(msg.LParam, typeof(DEV_BROADCAST_HDR));
switch ((int)msg.WParam)
{
case Win32CODES.DBT_DEVICEARRIVAL:
{
if (pHdr.dbch_devicetype == Win32CODES.DBT_DEVTYP_VOLUME)
{
DEV_BROADCAST_VOLUME pVol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(msg.LParam, typeof(DEV_BROADCAST_VOLUME));
Char c = GetDriveLetter(pVol.dbcv_unitmask);
if (c == 'I')
{
int bytesReturned = 0;
IntPtr buffer = Marshal.AllocHGlobal(sizeof(int));
SafeFileHandle _hdev = CreateFileR(c.ToString());
bool result = DeviceIoControl(_hdev, CTL_CODE(0x00000033, 0x0400, 0, 1),
IntPtr.Zero, 0, buffer, sizeof(int),
out bytesReturned, IntPtr.Zero);
int sessionId = Marshal.ReadInt32(buffer);
Marshal.FreeHGlobal(buffer);
}
}
break;
}
}
}
break;
}
}
base.WndProc(ref msg);
これを達成する方法はありますか?ありがとう..