在Windows 95上调用DeviceIoControl

【勇芳软件工作室】汉化HomePreviousNext

在Windows 95上运行的基于Win32的应用程序可以使用DeviceIoControl功能将控制代码直接发送到虚拟设备驱动程序(VxD)。任何VxD都可以支持任何数量的控制代码,或者根本没有。

系统VxD VWIN32.VXD支持最初由MS-DOS中断21h提供的输入和输出控制(IOCTL)功能。以下示例显示如何从基于Win32的应用程序调用Get Media ID(中断21h功能440Dh次要代码66h):

"\\\\.\\VxDName"

在Windows 95中,

#define VWIN32_DIOC_DOS_IOCTL 1

typedef struct _DEVIOCTL_REGISTERS {

DWORD reg_EBX;

DWORD reg_EDX;

DWORD reg_ECX;

DWORD reg_EAX;

DWORD reg_EDI;

DWORD reg_ESI;

DWORD reg_Flags;

} DEVIOCTL_REGISTERS, *PDEVIOCTL_REGISTERS;

typedef struct _MID {

WORD midInfoLevel;

DWORD midSerialNum;

BYTE midVolLabel[11];

BYTE midFileSysType[8];

} MID, *PMID;

BOOL GetMediaID(PMID pmid, UINT nDrive)

{

DEVIOCTL_REGISTERS reg;

reg.reg_EAX = 0x440D; /* IOCTL for block devices */

reg.reg_EBX = nDrive; /* zero-based drive ID */

reg.reg_ECX = 0x0866; /* Get Media ID command */

reg.reg_EDX = (DWORD) pmid; /* receives media ID info */

如果(!DoIOCTL(& reg))

return FALSE;

如果(reg.reg_Flags &为0x8000)/ *如果错误进位标志设定* /

return FALSE;

return TRUE;

}

BOOL DoIOCTL(PDEVIOCTL_REGISTERS preg)

{

HANDLE hDevice;

BOOL fResult;

DWORD cb;

preg->reg_Flags = 0x8000; /* assume error (carry flag set) */

hDevice = CreateFile("\\\\.\\vwin32",

GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,

(LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);

if (hDevice == (HANDLE) INVALID_HANDLE_VALUE)

return FALSE;

else {

fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_IOCTL,

preg, sizeof(*preg), preg, sizeof(*preg), &cb, 0);

如果(!fResult)

return FALSE;

}

CloseHandle(hDevice);

return TRUE;

}