summaryrefslogtreecommitdiff
path: root/libusb
diff options
context:
space:
mode:
Diffstat (limited to 'libusb')
-rw-r--r--libusb/os/windows_usbdk.c46
-rw-r--r--libusb/version_nano.h2
2 files changed, 42 insertions, 6 deletions
diff --git a/libusb/os/windows_usbdk.c b/libusb/os/windows_usbdk.c
index f65052e..aa48ce2 100644
--- a/libusb/os/windows_usbdk.c
+++ b/libusb/os/windows_usbdk.c
@@ -157,29 +157,65 @@ error_unload:
return LIBUSB_ERROR_NOT_FOUND;
}
+typedef SC_HANDLE (WINAPI *POPENSCMANAGERA)(LPCSTR, LPCSTR, DWORD);
+typedef SC_HANDLE (WINAPI *POPENSERVICEA)(SC_HANDLE, LPCSTR, DWORD);
+typedef BOOL (WINAPI *PCLOSESERVICEHANDLE)(SC_HANDLE);
+
static int usbdk_init(struct libusb_context *ctx)
{
+ POPENSCMANAGERA pOpenSCManagerA;
+ POPENSERVICEA pOpenServiceA;
+ PCLOSESERVICEHANDLE pCloseServiceHandle;
SC_HANDLE managerHandle;
SC_HANDLE serviceHandle;
+ HMODULE h;
+
+ h = LoadLibraryA("Advapi32");
+ if (h == NULL) {
+ usbi_warn(ctx, "failed to open Advapi32\n");
+ return LIBUSB_ERROR_OTHER;
+ }
+
+ pOpenSCManagerA = (POPENSCMANAGERA)GetProcAddress(h, "OpenSCManagerA");
+ if (pOpenSCManagerA == NULL) {
+ usbi_warn(ctx, "failed to find %s in Advapi32\n", "OpenSCManagerA");
+ goto error_free_library;
+ }
+ pOpenServiceA = (POPENSERVICEA)GetProcAddress(h, "OpenServiceA");
+ if (pOpenServiceA == NULL) {
+ usbi_warn(ctx, "failed to find %s in Advapi32\n", "OpenServiceA");
+ goto error_free_library;
+ }
+ pCloseServiceHandle = (PCLOSESERVICEHANDLE)GetProcAddress(h, "CloseServiceHandle");
+ if (pCloseServiceHandle == NULL) {
+ usbi_warn(ctx, "failed to find %s in Advapi32\n", "CloseServiceHandle");
+ goto error_free_library;
+ }
- managerHandle = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
+ managerHandle = pOpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
if (managerHandle == NULL) {
usbi_warn(ctx, "failed to open service control manager: %s", windows_error_str(0));
- return LIBUSB_ERROR_OTHER;
+ goto error_free_library;
}
- serviceHandle = OpenServiceA(managerHandle, "UsbDk", GENERIC_READ);
- CloseServiceHandle(managerHandle);
+ serviceHandle = pOpenServiceA(managerHandle, "UsbDk", GENERIC_READ);
+ pCloseServiceHandle(managerHandle);
if (serviceHandle == NULL) {
if (GetLastError() != ERROR_SERVICE_DOES_NOT_EXIST)
usbi_warn(ctx, "failed to open UsbDk service: %s", windows_error_str(0));
+ FreeLibrary(h);
return LIBUSB_ERROR_NOT_FOUND;
}
- CloseServiceHandle(serviceHandle);
+ pCloseServiceHandle(serviceHandle);
+ FreeLibrary(h);
return load_usbdk_helper_dll(ctx);
+
+error_free_library:
+ FreeLibrary(h);
+ return LIBUSB_ERROR_OTHER;
}
static void usbdk_exit(struct libusb_context *ctx)
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index aed0d3a..5e7ba8f 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 11429
+#define LIBUSB_NANO 11430