VOID NTAPI LoadCallback( _In_opt_ PVOID Parameter, _In_opt_ PVOID Context ) { PPH_STRING sbieDllPath; HMODULE module; HANDLE timerQueueHandle; HANDLE timerHandle; BoxedProcessesHashtable = PhCreateHashtable( sizeof(BOXED_PROCESS), BoxedProcessesEqualFunction, BoxedProcessesHashFunction, 32 ); sbieDllPath = PhaGetStringSetting(SETTING_NAME_SBIE_DLL_PATH); module = LoadLibrary(sbieDllPath->Buffer); SbieApi_QueryBoxPath = PhGetProcedureAddress(module, SbieApi_QueryBoxPath_Name, 0); SbieApi_EnumBoxes = PhGetProcedureAddress(module, SbieApi_EnumBoxes_Name, 0); SbieApi_EnumProcessEx = PhGetProcedureAddress(module, SbieApi_EnumProcessEx_Name, 0); SbieDll_KillAll = PhGetProcedureAddress(module, SbieDll_KillAll_Name, 0); if (NT_SUCCESS(RtlCreateTimerQueue(&timerQueueHandle))) { RtlCreateTimer(timerQueueHandle, &timerHandle, RefreshSandboxieInfo, NULL, 0, 4000, 0); } }
static VOID InitDnsApi( VOID ) { if (DnsApiHandle = LoadLibrary(L"dnsapi.dll")) { DnsGetCacheDataTable_I = PhGetProcedureAddress(DnsApiHandle, "DnsGetCacheDataTable", 0); DnsFlushResolverCache_I = PhGetProcedureAddress(DnsApiHandle, "DnsFlushResolverCache", 0); DnsFlushResolverCacheEntry_I = PhGetProcedureAddress(DnsApiHandle, "DnsFlushResolverCacheEntry_W", 0); } }
PVOID PhpImportProcedure( _Inout_ PVOID *Cache, _Inout_ PBOOLEAN CacheValid, _In_ PWSTR ModuleName, _In_ PSTR ProcedureName ) { PVOID module; PVOID procedure; if (*CacheValid) return *Cache; module = PhGetDllHandle(ModuleName); if (!module) return NULL; procedure = PhGetProcedureAddress(module, ProcedureName, 0); *Cache = procedure; MemoryBarrier(); *CacheValid = TRUE; return procedure; }
HRESULT CreateXCLRDataProcess( _In_ HANDLE ProcessId, _In_ ICLRDataTarget *Target, _Out_ struct IXCLRDataProcess **DataProcess ) { ULONG flags; BOOLEAN clrV4; HMODULE dllBase; HRESULT (__stdcall *clrDataCreateInstance)(REFIID, ICLRDataTarget *, void **); clrV4 = FALSE; if (NT_SUCCESS(PhGetProcessIsDotNetEx(ProcessId, NULL, 0, NULL, &flags))) { if (flags & PH_CLR_VERSION_4_ABOVE) clrV4 = TRUE; } // Load the correct version of mscordacwks.dll. if (clrV4) { static PH_INITONCE initOnce = PH_INITONCE_INIT; static HMODULE mscordacwksDllBase; if (PhBeginInitOnce(&initOnce)) { mscordacwksDllBase = LoadMscordacwks(TRUE); PhEndInitOnce(&initOnce); } dllBase = mscordacwksDllBase; } else { static PH_INITONCE initOnce = PH_INITONCE_INIT; static HMODULE mscordacwksDllBase; if (PhBeginInitOnce(&initOnce)) { mscordacwksDllBase = LoadMscordacwks(FALSE); PhEndInitOnce(&initOnce); } dllBase = mscordacwksDllBase; } if (!dllBase) return E_FAIL; clrDataCreateInstance = PhGetProcedureAddress(dllBase, "CLRDataCreateInstance", 0); if (!clrDataCreateInstance) return E_FAIL; return clrDataCreateInstance(&IID_IXCLRDataProcess, Target, DataProcess); }
static VOID NTAPI LoadCallback( _In_opt_ PVOID Parameter, _In_opt_ PVOID Context ) { if (WindowsVersion >= WINDOWS_VISTA) { if (IphlpHandle = LoadLibrary(L"iphlpapi.dll")) { GetIfEntry2_I = PhGetProcedureAddress(IphlpHandle, "GetIfEntry2", 0); GetInterfaceDescriptionFromGuid_I = PhGetProcedureAddress(IphlpHandle, "NhGetInterfaceDescriptionFromGuid", 0); NotifyIpInterfaceChange_I = PhGetProcedureAddress(IphlpHandle, "NotifyUnicastIpAddressChange", 0); CancelMibChangeNotify2_I = PhGetProcedureAddress(IphlpHandle, "CancelMibChangeNotify2", 0); ConvertLengthToIpv4Mask_I = PhGetProcedureAddress(IphlpHandle, "ConvertLengthToIpv4Mask", 0); } } NetAdaptersInitialize(); NetAdaptersLoadList(); }
static VOID NTAPI LoadCallback( _In_opt_ PVOID Parameter, _In_opt_ PVOID Context ) { PVOID ntdll; if (ntdll = PhGetDllHandle(L"ntdll.dll")) { NtAddBootEntry_I = PhGetProcedureAddress(ntdll, "NtAddBootEntry", 0); NtDeleteBootEntry_I = PhGetProcedureAddress(ntdll, "NtDeleteBootEntry", 0); NtModifyBootEntry_I = PhGetProcedureAddress(ntdll, "NtModifyBootEntry", 0); NtEnumerateBootEntries_I = PhGetProcedureAddress(ntdll, "NtEnumerateBootEntries", 0); NtQueryBootEntryOrder_I = PhGetProcedureAddress(ntdll, "NtQueryBootEntryOrder", 0); NtSetBootEntryOrder_I = PhGetProcedureAddress(ntdll, "NtSetBootEntryOrder", 0); NtQueryBootOptions_I = PhGetProcedureAddress(ntdll, "NtQueryBootOptions", 0); NtSetBootOptions_I = PhGetProcedureAddress(ntdll, "NtSetBootOptions", 0); NtTranslateFilePath_I = PhGetProcedureAddress(ntdll, "NtTranslateFilePath", 0); } }
BOOLEAN InitializeNvApi(VOID) { NvGpuPhysicalHandleList = PhCreateList(1); NvGpuDisplayHandleList = PhCreateList(1); #ifdef _M_IX86 if (!(NvApiLibrary = LoadLibrary(L"nvapi.dll"))) return FALSE; #else if (!(NvApiLibrary = LoadLibrary(L"nvapi64.dll"))) return FALSE; #endif if (!(NvAPI_QueryInterface = PhGetProcedureAddress(NvApiLibrary, "nvapi_QueryInterface", 0))) return FALSE; if (!(NvAPI_Initialize = NvAPI_QueryInterface(0x150E828UL))) return FALSE; if (!(NvAPI_Unload = NvAPI_QueryInterface(0xD22BDD7EUL))) return FALSE; if (!(NvAPI_GetErrorMessage = NvAPI_QueryInterface(0x6C2D048CUL))) return FALSE; if (!(NvAPI_EnumPhysicalGPUs = NvAPI_QueryInterface(0xE5AC921FUL))) return FALSE; if (!(NvAPI_EnumNvidiaDisplayHandle = NvAPI_QueryInterface(0x9ABDD40DUL))) return FALSE; // Information functions NvAPI_SYS_GetDriverAndBranchVersion = NvAPI_QueryInterface(0x2926AAADUL); NvAPI_GPU_GetFullName = NvAPI_QueryInterface(0xCEEE8E9FUL); // Query functions NvAPI_GPU_GetMemoryInfo = NvAPI_QueryInterface(0x774AA982UL); NvAPI_GPU_GetThermalSettings = NvAPI_QueryInterface(0xE3640A56UL); NvAPI_GPU_GetCoolerSettings = NvAPI_QueryInterface(0xDA141340UL); NvAPI_GPU_GetPerfDecreaseInfo = NvAPI_QueryInterface(0x7F7F4600UL); NvAPI_GPU_GetTachReading = NvAPI_QueryInterface(0x5F608315UL); NvAPI_GPU_GetAllClockFrequencies = NvAPI_QueryInterface(0xDCB616C3UL); // Undocumented Query functions NvAPI_GPU_GetUsages = NvAPI_QueryInterface(0x189A1FDFUL); NvAPI_GPU_GetAllClocks = NvAPI_QueryInterface(0x1BD69F49UL); NvAPI_GPU_GetVoltageDomainsStatus = NvAPI_QueryInterface(0xC16C7E2CUL); //NvAPI_GPU_GetPerfClocks = NvAPI_QueryInterface(0x1EA54A3B); //NvAPI_GPU_GetVoltages = NvAPI_QueryInterface(0x7D656244); //NvAPI_GPU_QueryActiveApps = NvAPI_QueryInterface(0x65B1C5F5); //NvAPI_GPU_GetShaderPipeCount = NvAPI_QueryInterface(0x63E2F56F); //NvAPI_GPU_GetShaderSubPipeCount = NvAPI_QueryInterface(0x0BE17923); NvAPI_GPU_GetRamBusWidth = NvAPI_QueryInterface(0x7975C581); // ADD ME NvAPI_GPU_GetRamBankCount = NvAPI_QueryInterface(0x17073A3CUL); NvAPI_GPU_GetRamType = NvAPI_QueryInterface(0x57F7CAACUL); NvAPI_GPU_GetRamMaker = NvAPI_QueryInterface(0x42AEA16AUL); NvAPI_GPU_GetFoundry = NvAPI_QueryInterface(0x5D857A00UL); //NvAPI_GetDisplayDriverMemoryInfo = NvAPI_QueryInterface(0x774AA982); //NvAPI_GetPhysicalGPUsFromDisplay = NvAPI_QueryInterface(0x34EF9506); NvAPI_GetDisplayDriverVersion = NvAPI_QueryInterface(0xF951A4D1UL); NvAPI_GetDisplayDriverRegistryPath = NvAPI_QueryInterface(0x0E24CEEEUL); //NvAPI_RestartDisplayDriver = NvAPI_QueryInterface(0xB4B26B65UL); //NvAPI_GPU_GetBoardInfo = NvAPI_QueryInterface(0x22D54523); //NvAPI_GPU_GetBusType = NvAPI_QueryInterface(0x1BB18724); //NvAPI_GPU_GetIRQ = NvAPI_QueryInterface(0xE4715417); NvAPI_GPU_GetVbiosVersionString = NvAPI_QueryInterface(0xA561FD7DUL); NvAPI_GPU_GetShortName = NvAPI_QueryInterface(0xD988F0F3UL); NvAPI_GPU_GetArchInfo = NvAPI_QueryInterface(0xD8265D24UL); NvAPI_GPU_GetPCIIdentifiers = NvAPI_QueryInterface(0x2DDFB66EUL); NvAPI_GPU_GetPartitionCount = NvAPI_QueryInterface(0x86F05D7AUL); NvAPI_GPU_GetGpuCoreCount = NvAPI_QueryInterface(0xC7026A87UL); NvAPI_GPU_GetPCIEInfo = NvAPI_QueryInterface(0xE3795199UL); NvAPI_GPU_GetFBWidthAndLocation = NvAPI_QueryInterface(0x11104158UL); NvAPI_GPU_ClientPowerTopologyGetStatus = NvAPI_QueryInterface(0x0EDCF624EUL); //typedef NvAPI_Status (WINAPIV *_NvAPI_GetDisplayDriverBuildTitle)(_In_ NvDisplayHandle hNvDisplay, NvAPI_ShortString pDriverBuildTitle); //typedef NvAPI_Status (WINAPIV *_NvAPI_GetDisplayDriverCompileType)(_In_ NvDisplayHandle hNvDisplay, NvU32* pDriverCompileType); //typedef NvAPI_Status (WINAPIV *_NvAPI_GetDisplayDriverSecurityLevel)(_In_ NvDisplayHandle hNvDisplay, NvU32* pDriverSecurityLevel); //typedef NvAPI_Status (WINAPIV *_NvAPI_GPU_GetVPECount)(_In_ NvPhysicalGpuHandle hPhysicalGPU, NvU32* pVPECount); //typedef NvAPI_Status (WINAPIV *_NvAPI_GPU_GetSerialNumber)(_In_ NvPhysicalGpuHandle hPhysicalGPU, NvU32* serialnumber); //typedef NvAPI_Status (WINAPIV *_NvAPI_GPU_GetExtendedMinorRevision)(_In_ NvPhysicalGpuHandle hPhysicalGPU, NvU32* revision); //typedef NvAPI_Status (WINAPIV *_NvAPI_GPU_GetTargetID)(_In_ NvPhysicalGpuHandle hPhysicalGPU, NvU32* target); //_NvAPI_GPU_GetExtendedMinorRevision NvAPI_GPU_GetExtendedMinorRevision; //_NvAPI_GPU_GetTargetID NvAPI_GPU_GetTargetID; //_NvAPI_GPU_GetSerialNumber NvAPI_GPU_GetSerialNumber; //_NvAPI_GPU_GetVPECount NvAPI_GPU_GetVPECount; //_NvAPI_GetDisplayDriverBuildTitle NvAPI_GetDisplayDriverBuildTitle; //_NvAPI_GetDisplayDriverCompileType NvAPI_GetDisplayDriverCompileType; //_NvAPI_GetDisplayDriverSecurityLevel NvAPI_GetDisplayDriverSecurityLevel; //NvAPI_GPU_GetExtendedMinorRevision = NvAPI_QueryInterface(0x025F17421); //NvAPI_GPU_GetTargetID = NvAPI_QueryInterface(0x35B5FD2F); //NvAPI_GPU_GetSerialNumber = NvAPI_QueryInterface(0x14B83A5F); //NvAPI_GPU_GetVPECount = NvAPI_QueryInterface(0xD8CBF37B); //NvAPI_GetDisplayDriverBuildTitle = NvAPI_QueryInterface(0x7562E947); //NvAPI_GetDisplayDriverCompileType = NvAPI_QueryInterface(0x988AEA78); //NvAPI_GetDisplayDriverSecurityLevel = NvAPI_QueryInterface(0x9D772BBA); if (NvAPI_Initialize() == NVAPI_OK) { NvGpuEnumPhysicalHandles(); NvGpuEnumDisplayHandles(); return TRUE; } return FALSE; }
HBITMAP PhIconToBitmap( _In_ HICON Icon, _In_ ULONG Width, _In_ ULONG Height ) { HBITMAP bitmap; RECT iconRectangle; HDC screenHdc; HDC hdc; HBITMAP oldBitmap; BLENDFUNCTION blendFunction = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; BP_PAINTPARAMS paintParams = { sizeof(paintParams) }; HDC bufferHdc; HPAINTBUFFER paintBuffer; iconRectangle.left = 0; iconRectangle.top = 0; iconRectangle.right = Width; iconRectangle.bottom = Height; if (!ImportsInitialized) { HMODULE uxtheme; uxtheme = GetModuleHandle(L"uxtheme.dll"); BeginBufferedPaint_I = PhGetProcedureAddress(uxtheme, "BeginBufferedPaint", 0); EndBufferedPaint_I = PhGetProcedureAddress(uxtheme, "EndBufferedPaint", 0); GetBufferedPaintBits_I = PhGetProcedureAddress(uxtheme, "GetBufferedPaintBits", 0); ImportsInitialized = TRUE; } if (!BeginBufferedPaint_I || !EndBufferedPaint_I || !GetBufferedPaintBits_I) { // Probably XP. screenHdc = GetDC(NULL); hdc = CreateCompatibleDC(screenHdc); bitmap = CreateCompatibleBitmap(screenHdc, Width, Height); ReleaseDC(NULL, screenHdc); oldBitmap = SelectObject(hdc, bitmap); FillRect(hdc, &iconRectangle, (HBRUSH)(COLOR_WINDOW + 1)); DrawIconEx(hdc, 0, 0, Icon, Width, Height, 0, NULL, DI_NORMAL); SelectObject(hdc, oldBitmap); DeleteDC(hdc); return bitmap; } screenHdc = GetDC(NULL); hdc = CreateCompatibleDC(screenHdc); bitmap = PhpCreateBitmap32(screenHdc, Width, Height, NULL); ReleaseDC(NULL, screenHdc); oldBitmap = SelectObject(hdc, bitmap); paintParams.dwFlags = BPPF_ERASE; paintParams.pBlendFunction = &blendFunction; paintBuffer = BeginBufferedPaint_I(hdc, &iconRectangle, BPBF_DIB, &paintParams, &bufferHdc); DrawIconEx(bufferHdc, 0, 0, Icon, Width, Height, 0, NULL, DI_NORMAL); // If the icon did not have an alpha channel, we need to convert the buffer to PARGB. PhpConvertToPArgb32IfNeeded(paintBuffer, hdc, Icon, Width, Height); // This will write the buffer contents to the destination bitmap. EndBufferedPaint_I(paintBuffer, TRUE); SelectObject(hdc, oldBitmap); DeleteDC(hdc); return bitmap; }
VOID NvApiInitialize(VOID) { ULONG sampleCount; if (!PhGetIntegerSetting(SETTING_NAME_ENABLE_GPU)) return; sampleCount = PhGetIntegerSetting(L"SampleCount"); PhInitializeCircularBuffer_FLOAT(&GpuUtilizationHistory, sampleCount); PhInitializeCircularBuffer_ULONG(&GpuMemoryHistory, sampleCount); PhInitializeCircularBuffer_FLOAT(&GpuBoardHistory, sampleCount); PhInitializeCircularBuffer_FLOAT(&GpuBusHistory, sampleCount); NvGpuPhysicalHandleList = PhCreateList(1); NvGpuDisplayHandleList = PhCreateList(1); #ifdef _M_IX86 if (!(NvApiLibrary = LoadLibrary(L"nvapi.dll"))) return; #else if (!(NvApiLibrary = LoadLibrary(L"nvapi64.dll"))) return; #endif // Retrieve the NvAPI_QueryInterface function address if (!(NvAPI_QueryInterface = PhGetProcedureAddress(NvApiLibrary, "nvapi_QueryInterface", 0))) return; // Initialization functions if (!(NvAPI_Initialize = NvAPI_QueryInterface(0x150E828UL))) return; if (!(NvAPI_Unload = NvAPI_QueryInterface(0xD22BDD7EUL))) return; // Error functions NvAPI_GetErrorMessage = NvAPI_QueryInterface(0x6C2D048CUL); // Handle functions NvAPI_EnumPhysicalGPUs = NvAPI_QueryInterface(0xE5AC921FUL); NvAPI_EnumNvidiaDisplayHandle = NvAPI_QueryInterface(0x9ABDD40DUL); // Information functions NvAPI_SYS_GetDriverAndBranchVersion = NvAPI_QueryInterface(0x2926AAADUL); NvAPI_GPU_GetFullName = NvAPI_QueryInterface(0xCEEE8E9FUL); // Query functions NvAPI_GPU_GetMemoryInfo = NvAPI_QueryInterface(0x774AA982UL); NvAPI_GPU_GetThermalSettings = NvAPI_QueryInterface(0xE3640A56UL); NvAPI_GPU_GetCoolerSettings = NvAPI_QueryInterface(0xDA141340UL); NvAPI_GPU_GetPerfDecreaseInfo = NvAPI_QueryInterface(0x7F7F4600UL); NvAPI_GPU_GetTachReading = NvAPI_QueryInterface(0x5F608315UL); NvAPI_GPU_GetAllClockFrequencies = NvAPI_QueryInterface(0xDCB616C3UL); // Undocumented functions below NvAPI_GPU_GetUsages = NvAPI_QueryInterface(0x189A1FDFUL); NvAPI_GPU_GetAllClocks = NvAPI_QueryInterface(0x1BD69F49UL); NvAPI_GPU_GetVoltageDomainsStatus = NvAPI_QueryInterface(0xC16C7E2CUL); NvAPI_GPU_GetPerfClocks = NvAPI_QueryInterface(0x1EA54A3B); NvAPI_GPU_GetVoltages = NvAPI_QueryInterface(0x7D656244); NvAPI_GPU_QueryActiveApps = NvAPI_QueryInterface(0x65B1C5F5); NvAPI_GPU_GetShaderPipeCount = NvAPI_QueryInterface(0x63E2F56F); NvAPI_GPU_GetShaderSubPipeCount = NvAPI_QueryInterface(0x0BE17923); NvAPI_GPU_GetRamBusWidth = NvAPI_QueryInterface(0x7975C581); NvAPI_GPU_GetRamBankCount = NvAPI_QueryInterface(0x17073A3CUL); NvAPI_GPU_GetRamType = NvAPI_QueryInterface(0x57F7CAACUL); NvAPI_GPU_GetRamMaker = NvAPI_QueryInterface(0x42AEA16AUL); NvAPI_GPU_GetFoundry = NvAPI_QueryInterface(0x5D857A00UL); //NvAPI_GetDisplayDriverMemoryInfo = NvAPI_QueryInterface(0x774AA982); //NvAPI_GetPhysicalGPUsFromDisplay = NvAPI_QueryInterface(0x34EF9506); NvAPI_GetDisplayDriverVersion = NvAPI_QueryInterface(0xF951A4D1UL); NvAPI_GetDisplayDriverRegistryPath = NvAPI_QueryInterface(0x0E24CEEEUL); //NvAPI_RestartDisplayDriver = NvAPI_QueryInterface(0xB4B26B65UL); //NvAPI_GPU_GetBoardInfo = NvAPI_QueryInterface(0x22D54523); //NvAPI_GPU_GetBusType = NvAPI_QueryInterface(0x1BB18724); //NvAPI_GPU_GetIRQ = NvAPI_QueryInterface(0xE4715417); NvAPI_GPU_GetVbiosVersionString = NvAPI_QueryInterface(0xA561FD7DUL); NvAPI_GPU_GetShortName = NvAPI_QueryInterface(0xD988F0F3UL); NvAPI_GPU_GetArchInfo = NvAPI_QueryInterface(0xD8265D24UL); NvAPI_GPU_GetPCIIdentifiers = NvAPI_QueryInterface(0x2DDFB66EUL); NvAPI_GPU_GetPartitionCount = NvAPI_QueryInterface(0x86F05D7AUL); NvAPI_GPU_GetGpuCoreCount = NvAPI_QueryInterface(0xC7026A87UL); NvAPI_GPU_GetPCIEInfo = NvAPI_QueryInterface(0xE3795199UL); NvAPI_GPU_GetFBWidthAndLocation = NvAPI_QueryInterface(0x11104158UL); NvAPI_GPU_ClientPowerTopologyGetStatus = NvAPI_QueryInterface(0x0EDCF624EUL); NvAPI_GetDisplayDriverBuildTitle = NvAPI_QueryInterface(0x7562E947); NvAPI_GetDisplayDriverCompileType = NvAPI_QueryInterface(0x988AEA78); NvAPI_GetDisplayDriverSecurityLevel = NvAPI_QueryInterface(0x9D772BBA); NvAPI_GPU_GetVPECount = NvAPI_QueryInterface(0xD8CBF37B); NvAPI_GPU_GetTargetID = NvAPI_QueryInterface(0x35B5FD2F); //NvAPI_GPU_GetExtendedMinorRevision = NvAPI_QueryInterface(0x025F17421); //NvAPI_GPU_GetSerialNumber = NvAPI_QueryInterface(0x14B83A5F); if (NvAPI_Initialize() == NVAPI_OK) { NvGpuEnumPhysicalHandles(); NvGpuEnumDisplayHandles(); NvApiInitialized = TRUE; } }
VOID ShowDeviceMenu( _In_ HWND ParentWindow, _In_ PPH_STRING DeviceInstance ) { POINT cursorPos; PPH_EMENU menu; PPH_EMENU_ITEM selectedItem; GetCursorPos(&cursorPos); menu = PhCreateEMenu(); //PhInsertEMenuItem(menu, PhCreateEMenuItem(0, 0, L"Enable", NULL, NULL), -1); //PhInsertEMenuItem(menu, PhCreateEMenuItem(0, 1, L"Disable", NULL, NULL), -1); //PhInsertEMenuItem(menu, PhCreateEMenuItem(PH_EMENU_SEPARATOR, 0, NULL, NULL, NULL), -1); PhInsertEMenuItem(menu, PhCreateEMenuItem(0, 1, L"Properties", NULL, NULL), -1); selectedItem = PhShowEMenu( menu, PhMainWndHandle, PH_EMENU_SHOW_LEFTRIGHT, PH_ALIGN_LEFT | PH_ALIGN_TOP, cursorPos.x, cursorPos.y ); if (selectedItem && selectedItem->Id != -1) { switch (selectedItem->Id) { case 1: { HMODULE devMgrHandle; // https://msdn.microsoft.com/en-us/library/ff548181.aspx VOID (WINAPI *DeviceProperties_RunDLL_I)( _In_ HWND hwndStub, _In_ HINSTANCE hAppInstance, _In_ PWSTR lpCmdLine, _In_ INT nCmdShow ); if (devMgrHandle = LoadLibrary(L"devmgr.dll")) { if (DeviceProperties_RunDLL_I = PhGetProcedureAddress(devMgrHandle, "DeviceProperties_RunDLLW", 0)) { // This will sometimes re-throw an RPC error during debugging and can be safely ignored. DeviceProperties_RunDLL_I( GetParent(ParentWindow), NULL, PhaFormatString(L"/DeviceID %s", DeviceInstance->Buffer)->Buffer, 0 ); } FreeLibrary(devMgrHandle); } } break; } } PhDestroyEMenu(menu); }