HMODULE queueLoadLibrary()

in cortado/rtas/src/LoadLib-Callback64.cpp [35:61]


HMODULE queueLoadLibrary(WCHAR *libraryName, BOOL swtch) {
  IMPORTAPI(L"NTDLL.dll", NtWaitForSingleObject, NTSTATUS, HANDLE, BOOLEAN,
            PLARGE_INTEGER);

  if (swtch) {
    IMPORTAPI(L"NTDLL.dll", RtlQueueWorkItem, NTSTATUS, PVOID, PVOID, ULONG);

    if (NT_SUCCESS(RtlQueueWorkItem(&LoadLibraryW, (PVOID)libraryName,
                                    WT_EXECUTEDEFAULT))) {
      LARGE_INTEGER timeout;
      timeout.QuadPart = -500000;
      NtWaitForSingleObject(NtCurrentProcess(), FALSE, &timeout);
    }
  } else {
    IMPORTAPI(L"NTDLL.dll", RtlRegisterWait, NTSTATUS, PHANDLE, HANDLE, PVOID,
              PVOID, ULONG, ULONG);
    HANDLE newWaitObject;
    HANDLE eventObject = CreateEventW(NULL, FALSE, FALSE, NULL);

    if (NT_SUCCESS(RtlRegisterWait(&newWaitObject, eventObject, LoadLibraryW,
                                   (PVOID)libraryName, 0, WT_EXECUTEDEFAULT))) {
      WaitForSingleObject(eventObject, 500);
    }
  }

  return getModuleHandle(libraryName);
}