Snoopy ProUSBSnpys
Win32アプリからドライバをいじるのは,カーネルモードで動作するI/Oマネージャ.Win32アプリからは,ファイルを操作するWin32APIを使ってIRP(I/O Request Packet)をI/Oマネージャに送り,I/OマネージャはIRPをデバイスドライバに送信して,デバイスドライバがデバイスを制御する.
SnoopyPro-SnoopyPro.cppに,
HANDLE hSniffer = CreateFile(USBSNPYS_W32NAME_2K,...
HANDLE hSniffer = CreateFile(USBSNPYS_W32NAME_9X,..
って言う記述がある.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
DDKのDeviceTreeを使って,usbsnpysを見てみる.
Major Function Codes Supportedの欄に
- IRP_MJ_CREATE
- IRP_MJ_CLOSE
- IRP_MJ_DEVICE_CONTROL
- IRP_MJ_INTERNAL_DEVICE_CONTROL
がある.最後のはカーネルモードのアプリのみアクセス可能で,Snoopy Proからは実質IRP_MJ_DEVICE_CONTROL(DeviceIoControl())しか使っていないことが推測される.
BOOL DeviceIoControl( HANDLE hDevice, // デバイス、ファイル、ディレクトリいずれかのハンドル DWORD dwIoControlCode, // 実行する動作の制御コード LPVOID lpInBuffer, // 入力データを供給するバッファへのポインタ DWORD nInBufferSize, // 入力バッファのバイト単位のサイズ LPVOID lpOutBuffer, // 出力データを受け取るバッファへのポインタ DWORD nOutBufferSize, // 出力バッファのバイト単位のサイズ LPDWORD lpBytesReturned, // バイト数を受け取る変数へのポインタ LPOVERLAPPED lpOverlapped // 非同期動作を表す構造体へのポインタ );
Snoopy Proには
DWORD dwBytesReturned = 0; SNOOPED_DEVICES SnoopedDevices; ZeroMemory(&SnoopedDevices, sizeof(SnoopedDevices)); BOOL bResult = DeviceIoControl(hSniffer, USBSNOOP_GET_SNOOPED_DEVS, &SnoopedDevices, sizeof(SnoopedDevices), &SnoopedDevices, sizeof(SnoopedDevices), &dwBytesReturned, NULL);
typedef struct SNOOPED_DEVICE { ULONG uDeviceID; PDEVICE_OBJECT DeviceObject; WCHAR sHardwareIDs[MAX_PATH]; ULONG uTimeStampZero; CRingBuffer Buffer; } SNOOPED_DEVICE, *PSNOOPED_DEVICE; typedef struct SNOOPED_DEVICES { ULONG uCount; SNOOPED_DEVICE Entry[MAX_SNOOPY_DRIVERS]; } SNOOPED_DEVICES, *PSNOOPED_DEVICES;
とある.だんだん分かってきたぞ.
では,第2引数dwIoControlCodeには何を入力しているか.
#define USBSNOOP_CODE(_x_) CTL_CODE( \ FILE_DEVICE_UNKNOWN, \ (0x800 | _x_), \ METHOD_BUFFERED, \ FILE_ANY_ACCESS \ ) #define USBSNOOP_GET_SNOOPED_DEVS USBSNOOP_CODE(0) #define USBSNOOP_ENABLE_LOGGING USBSNOOP_CODE(1) #define USBSNOOP_GET_URBS USBSNOOP_CODE(2) #define USBSNOOP_GET_BUFFER_FULLNESS USBSNOOP_CODE(3) #define USBSNOOPIES_HELLO USBSNOOP_CODE(42)