Вызов функции DeviceIoControl в среде Windows Me/98/95


Приложение, запускающееся в среде Windows Me/98/95 может использовать функцию DeviceIoControl, чтобы отправлять управляющие коды непосредственно драйверу виртуального устройства (VxD). Любой VxD может поддержать любое число управляющих кодов, или вообще ни одного.

Системный VxD, VWIN32.VXD, поддерживает функции управляющие вводом и выводом данных (IOCTL) при помощи первоначально предусмотренного в MS-DOS прерывания 21h. Следующий пример показывает, как вызвать модуль Get Media ID (прерывание  21h функции 440Dh младший код 66h) из приложения:

#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 блока устройств 
    reg.reg_EBX = nDrive;       // ID диска с отсчетом от нуля 
    reg.reg_ECX = 0x0866;       // команда Get Media ID 
    reg.reg_EDX = (DWORD) pmid; // ID информации полученной носителем информации 
 
    if (!DoIOCTL(&reg)) 
        return FALSE; 
 
    if (reg.reg_Flags & 0x8000) // ошибка, если установлен флаг переноса 
        return FALSE; 
 
    return TRUE; 
} 
 
BOOL DoIOCTL(PDEVIOCTL_REGISTERS preg) 
{ 
    HANDLE hDevice; 
 
    BOOL fResult; 
    DWORD cb; 
 
    preg->reg_Flags = 0x8000; // допущена ошибка(установлен флаг переноса) 
 
    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); 
    } 
 
    CloseHandle(hDevice); 
 
    return fResult;

}

 

Пример, который работает в других версиях Windows, см.  статье Вызов функции DeviceIoControl.

Назад в оглавление
На главную страницу

Hosted by uCoz