OPTIONS "C_CALL LABELCHECK WINFUNC NOSOURCE" DO FUNCDEF("CreateFileA", "void, str, 32u, 32u, 32u, 32u, 32u, 32u", "kernel32") FUNCDEF("CloseHandle", "32u, void", "kernel32") STORAGE_DEVICE_DESCRIPTOR = "32u, 32u, 8u, 8u, 8u, 8u, 32u, 32u, 32u, 32u, 32u, 32u, 32u" STORAGE_PROPERTY_QUERY = "32u, 32u, 32u" FUNCDEF("DeviceIoControl", "32u, void, 32u, struct STORAGE_PROPERTY_QUERY, 32u, struct STORAGE_DEVICE_DESCRIPTOR stor, 32u, 32u stor, 32u", "kernel32") CATCH FAILURE CONDITION("M") RETURN END IF IsDriveUSB("D") == "YES" THEN SAY ARG(1) || ": is a USB drive." RETURN IsDriveUSB: PROCEDURE USBTYPE = 7 Filename = "\\?\" || ARG(1) || ":" device = CreateFileA(Filename, 2147483648, 3, 0, 3, 0, 0) IF device \= -1 THEN DO query.1 = 0; query.2 = 0; query.3 = 0 IF DeviceIoControl(Device, 2954240, query, 12, desc, 40, outBytes, 0) = 1 THEN DO IF desc.11 = USBTYPE THEN DO CloseHandle(device) RETURN "YES" END END CloseHandle(device) END ELSE SAY STREAM(Filename, "D") RETURN "NO"