8.21.2007

DeviceIoControl

DeviceIoControl 的MSDN reference 在 http://msdn2.microsoft.com/en-us/library/ms960189.aspx

以 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。

沒有留言: