在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;
}