检测exe是否正在从USB运行

时间:2020-08-06 13:01:01

标签: c++ c windows

我正在使用Windows API编写应用程序,该应用程序需要在启动时检查其是否正在从USB设备运行。 到目前为止我取得的成就

  • 使用SetupDiEnumDeviceInfo列出设备
  • 检测可移动设备

这是我的代码,可以完成上述两个任务

HDEVINFO hdevinfo = SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE,NULL, NULL, DIGCF_PRESENT);
if (hdevinfo == INVALID_HANDLE_VALUE) {
    WriteLog(L"hdevinfo is INVALID_HANDLE_VALUE");
    return USB_PROT_ERROR;
}
DWORD MemberIndex = 0;
SP_DEVINFO_DATA sp_devinfo_data;
ZeroMemory(&sp_devinfo_data, sizeof(sp_devinfo_data));
sp_devinfo_data.cbSize = sizeof(sp_devinfo_data);
while (SetupDiEnumDeviceInfo(hdevinfo, MemberIndex, &sp_devinfo_data)) {
    DWORD PropertyRegDataType;
    DWORD RequiredSize;
    TCHAR PropertyBuffer[500];
    //get the name of this device
    if (SetupDiGetDeviceRegistryProperty(hdevinfo, &sp_devinfo_data, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, &PropertyRegDataType, (PBYTE)&PropertyBuffer, sizeof(PropertyBuffer), &RequiredSize)) {
        WriteLog(L"Device name: %s", PropertyBuffer);
        DWORD PropertyValue;
        //get removal policy for this device
        if (SetupDiGetDeviceRegistryProperty(hdevinfo, &sp_devinfo_data, SPDRP_REMOVAL_POLICY, &PropertyRegDataType, (PBYTE)&PropertyValue, sizeof(PropertyValue), &RequiredSize)) {
            if (PropertyValue == CM_REMOVAL_POLICY_EXPECT_NO_REMOVAL) {
                //not removable
                WriteLog(L"Not Removable");
            }
            else {
                //removable
                WriteLog("Removable");
            }
        }
    }
}

在连接了1个HARD DRIVE和1个USB DRIVE的PC上,得到以下输出:

Device name: \Device\00000031
Not Removable

Device name: \Device\00000070
Removable

从输出中可以清楚地看到 \ Device \ 00000070 是我的USB设备。从“我的电脑”中,我可以看到我的USB设备已安装在 H 驱动器

我现在想要实现的是

  • 找出可移动设备(在我的情况下为 \ Device \ 00000070 )安装在哪个驱动器号(在我的情况下为 H:)上。

OR

  • 找出该设备下的所有卷(我可以说的子设备)。例如,如果我将GUID_DEVCLASS_VOLUME GUID传递给SetupDiGetClassDevs函数,则我的输出将如下所示:

    设备名称:\ Device \ HarddiskVolume2 不可移动

    设备名称:\ Device \ HarddiskVolume4 不可移动

    设备名称:\ Device \ HarddiskVolume9 不可移动

    设备名称:\ Device \ HarddiskVolume5 不可移动

经过一些调试后,我发现 \ Device \ HarddiskVolume9 是我的USB,但是您可以在输出中看到它始终显示“不可移动” 。因此,如果我发现 \ Device \ HarddiskVolume9 属于 \ Device \ 00000070 ,那么这对我也将很有效使用卷管理功能查找 \ Device \ HarddiskVolume9 的驱动器号,并与可执行文件的驱动器号匹配。

我想使用C / C ++ Windows API来执行此操作,而无需使用任何第三方库且没有.NET代码。

1 个答案:

答案 0 :(得分:1)

Windows API函数GetDriveType返回以下内容:

DRIVE_UNKNOWN -0-无法确定驱动器类型。

DRIVE_NO_ROOT_DIR -1-根路径无效;例如,在指定的路径上没有安装卷。

DRIVE_REMOVABLE -2-驱动器具有可移动介质;例如,软盘驱动器,拇指驱动器或闪存卡读取器。

DRIVE_FIXED -3-驱动器具有固定介质;例如,硬盘驱动器或闪存驱动器。

DRIVE_REMOTE -4-该驱动器是远程(网络)驱动器。

DRIVE_CDROM -5-该驱动器是CD-ROM驱动器。

DRIVE_RAMDISK -6-该驱动器是RAM磁盘。

因此,我将使用以下代码,检查返回值是否等于(2)-可移动:

#include <windows.h>
int main()
{
    wchar_t basePath[1024]{ L"" }, volName[1024]{ L"" };
    GetModuleFileName(NULL, basePath, 1024);
    GetVolumePathName(basePath, volName, 1024);

    UINT type = GetDriveType(volName);
    if (type == 2)
    {
        MessageBox(NULL, L"You are running from a flash drive (USB)",L"",MB_OK);
    }
    else
    {
        MessageBox(NULL, L"You are NOT running from a flash drive (USB)",L"", MB_OK);

    }
}