static PyObject * winutil_is_usb_device_connected(PyObject *self, PyObject *args) { unsigned int vid, pid; HDEVINFO hDevInfo; DWORD i; BOOL iterate = TRUE; LPWSTR buffer; int found = FALSE; PyObject *ans; if (!PyArg_ParseTuple(args, "ii", &vid, &pid)) { return NULL; } // Create a Device information set with all USB devices hDevInfo = create_device_info_set(NULL, L"USB", 0, DIGCF_PRESENT | DIGCF_ALLCLASSES); if (hDevInfo == INVALID_HANDLE_VALUE) return NULL; // Enumerate through the set for (i=0; iterate && !found; i++) { buffer = get_registry_property(hDevInfo, i, SPDRP_HARDWAREID, &iterate); if (buffer == NULL) { PyErr_Print(); continue; } found = check_device_id(buffer, vid, pid); PyMem_Free(buffer); } // for SetupDiDestroyDeviceInfoList(hDevInfo); ans = (found) ? Py_True : Py_False; Py_INCREF(ans); return ans; }
static PyObject * winutil_get_usb_devices(PyObject *self, PyObject *args) { unsigned int j; size_t buffersize; HDEVINFO hDevInfo; DWORD i; BOOL iterate = TRUE; PyObject *devices, *temp = (PyObject *)1; LPWSTR buffer; BOOL ok = 1; if (!PyArg_ParseTuple(args, "")) return NULL; devices = PyList_New(0); if (devices == NULL) {PyErr_NoMemory(); return NULL;} // Create a Device information set with all USB devices hDevInfo = create_device_info_set(NULL, L"USB", 0, DIGCF_PRESENT | DIGCF_ALLCLASSES); if (hDevInfo == INVALID_HANDLE_VALUE) { Py_DECREF(devices); return NULL; } // Enumerate through the set for (i=0; iterate; i++) { buffer = get_registry_property(hDevInfo, i, SPDRP_HARDWAREID, &iterate); if (buffer == NULL) { PyErr_Print(); continue; } buffersize = wcslen(buffer); for (j = 0; j < buffersize; j++) buffer[j] = towlower(buffer[j]); temp = PyUnicode_FromWideChar(buffer, buffersize); PyMem_Free(buffer); if (temp == NULL) { PyErr_NoMemory(); ok = 0; break; } PyList_Append(devices, temp); Py_DECREF(temp); temp = NULL; } //for if (!ok) { Py_DECREF(devices); devices = NULL; } SetupDiDestroyDeviceInfoList(hDevInfo); return devices; }
static PyObject * winutil_get_removable_drives(PyObject *self, PyObject *args) { HDEVINFO hDevInfo; BOOL iterate = TRUE, ddebug = FALSE; PSP_DEVICE_INTERFACE_DETAIL_DATA interfaceDetailData; DWORD i; unsigned int j, length; WCHAR volume[BUFSIZE]; struct tagDrives g_drives[MAX_DRIVES]; PyObject *volumes, *key, *candidates, *pdebug = Py_False, *temp; if (!PyArg_ParseTuple(args, "|O", &pdebug)) { return NULL; } // Find all removable drives for (j = 0; j < MAX_DRIVES; j++) g_drives[j].letter = 0; if (!get_all_removable_disks(g_drives)) return NULL; volumes = PyDict_New(); if (volumes == NULL) return PyErr_NoMemory(); ddebug = PyObject_IsTrue(pdebug); hDevInfo = create_device_info_set((LPGUID)&GUID_DEVINTERFACE_VOLUME, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hDevInfo == INVALID_HANDLE_VALUE) { Py_DECREF(volumes); return NULL; } // Enumerate through the set for (i=0; iterate; i++) { candidates = PyList_New(0); if (candidates == NULL) { Py_DECREF(volumes); return PyErr_NoMemory();} interfaceDetailData = get_device_ancestors(hDevInfo, i, candidates, &iterate, ddebug); if (interfaceDetailData == NULL) { PyErr_Print(); Py_DECREF(candidates); candidates = NULL; continue; } length = wcslen(interfaceDetailData->DevicePath); interfaceDetailData->DevicePath[length] = L'\\'; interfaceDetailData->DevicePath[length+1] = 0; if (ddebug) console_out(L"Device path: %s\n", interfaceDetailData->DevicePath); // On Vista+ DevicePath contains the information we need. temp = PyUnicode_FromWideChar(interfaceDetailData->DevicePath, length); if (temp == NULL) return PyErr_NoMemory(); PyList_Append(candidates, temp); Py_DECREF(temp); if(GetVolumeNameForVolumeMountPointW(interfaceDetailData->DevicePath, volume, BUFSIZE)) { if (ddebug) console_out(L"Volume: %s\n", volume); for(j = 0; j < MAX_DRIVES; j++) { if(g_drives[j].letter != 0 && wcscmp(g_drives[j].volume, volume)==0) { if (ddebug) printf("Found drive: %c\n", (char)g_drives[j].letter); fflush(stdout); key = PyBytes_FromFormat("%c", (char)g_drives[j].letter); if (key == NULL) return PyErr_NoMemory(); PyDict_SetItem(volumes, key, candidates); Py_DECREF(key); key = NULL; break; } } } Py_XDECREF(candidates); candidates = NULL; PyMem_Free(interfaceDetailData); } //for SetupDiDestroyDeviceInfoList(hDevInfo); return volumes; }