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)