如何识别移动硬盘(Ring3)

2011-5-1 Nie.Meining Coding

好久没写东西了,贴点代码,庆祝五一。

 

Ring 3下的方法:

童鞋们应该已经发现了,GetDriveType函数只能识别出U盘,无法识别移动硬盘。移动硬盘和本地硬盘将返回相同的类型DRIVE_FIXED。MSDN上的建议是用一个蛋疼无比的函数SetupDiGetDeviceRegistryProperty来识别USB设备。

其实有个更方便的方法,可以通过DeviceIoControl函数查询总线类型来识别USB设备。贴代码:

BOOL IsUsbDriver(TCHAR tchDrvName)

    /*++

 

    Routine Description:

 

    判断某分区是否是USB设备。

 

    Arguments:

 

    tchDrvName - 输入参数,驱动器号。

 

    Return Value:

 

    USB设备则返回TRUE,否则返回FALSE

    查询失败也返回FALSE

 

    Author:

    Fypher

    http://hi.baidu.com/nmn714

    2011/5/1

 

    --*/

{

    TCHAR tcsDrvName[8] = TEXT("\\\\.\\X:");

    tcsDrvName[4] = tchDrvName;

 

    HANDLE hDevice = CreateFile( tcsDrvName,

        GENERIC_READ,

        FILE_SHARE_READ | FILE_SHARE_WRITE,

        NULL,

        OPEN_EXISTING,

        FILE_ATTRIBUTE_NORMAL,

        NULL

        );

 

    if ( hDevice == INVALID_HANDLE_VALUE ) {

        return FALSE;

    }

 

 

    STORAGE_PROPERTY_QUERY StoragePropertyQuery;

    StoragePropertyQuery.PropertyId = StorageDeviceProperty;

    StoragePropertyQuery.QueryType = PropertyStandardQuery;

 

 

    BYTE buff[1024] = {0};

    PSTORAGE_DEVICE_DESCRIPTOR pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)buff;

    pDevDesc->Size = sizeof(buff);

 

 

    DWORD dwOutLen;

    BOOL res = DeviceIoControl( hDevice,

        IOCTL_STORAGE_QUERY_PROPERTY,

        &StoragePropertyQuery,

        sizeof(STORAGE_PROPERTY_QUERY),

        pDevDesc,

        pDevDesc->Size,

        &dwOutLen,

        NULL

        );

    CloseHandle(hDevice);

 

    if (res) {

        // 返回结果

        return pDevDesc->BusType == BusTypeUsb;

    } else {

        // 查询失败

        return FALSE;

    }

}

 

完工。祝大家节日快乐!

发表评论:

Powered by emlog