[轉載] DeviceIoControl

DeviceIoControl 的MSDN reference
以 WAVEDEV 為例IO Control Code 定義在 PUBLIC\COMMON\OAK\INC\WAVEDEV.H 中
這個 header file 的 comment 中有說明 audio driver 的複雜架構。
WAVDEV 處理的IO Control Cmd 有
IOCTL_MIX_MESSAGE
IOCTL_WAV_MESSAGE
都定義在這裡,這兩個 command code 都屬於 FILE_DEVICE_SOUND (分別是 3, 115)。
device io control 又把parameter 作進一步擴充,
把argument 再定義為 message (PMMDRV_MESSAGE_PARMS):

typedef struct {
UINT uDeviceId;
UINT uMsg;
DWORD dwUser;
DWORD dwParam1;
DWORD dwParam2;
} MMDRV_MESSAGE_PARAMS;
所以.. WAVEDEV 的IO Control handler 再依照 uMsg 細分 command。
使用時,要先CreateFile("drivername"..),
"drivername"就是那個 3 char + 1 index.
取得的handle 傳入 DevIoControl ( )作第一個argument,
prototype:
BOOL DeviceIoControl( HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped);
和 KernelIoControl( )比起來,除了一開始的 hDevice外,
就是最後的 Overlapped. - 這個固定要用 NULL。

虹光大成就-密教灌頂(一)