From 3f9f0e2a961a11f7aeab296b4b72acae54411029 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 8 Mar 2026 12:22:47 +0100 Subject: [PATCH] [PSDK][DHCSCSVC][IPCONFIG] Add DhcpHandlePnpEvent stub and use it in ipconfig Ipconfig uses DhcpHandlePnpEvent to notify the dhcp client of a changed class id. --- base/applications/network/ipconfig/ipconfig.c | 27 ++++++++++++++++++- base/services/dhcpcsvc/dhcpcsvc.c | 11 +++++--- sdk/include/psdk/dhcpcapi.h | 17 +++++++++++- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/base/applications/network/ipconfig/ipconfig.c b/base/applications/network/ipconfig/ipconfig.c index e9d9cd91c11..eaf16c83a2b 100644 --- a/base/applications/network/ipconfig/ipconfig.c +++ b/base/applications/network/ipconfig/ipconfig.c @@ -1244,8 +1244,10 @@ SetClassId( ULONG ret = 0; WCHAR szFriendlyName[MAX_PATH]; WCHAR szKeyName[256]; + WCHAR szUnicodeAdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; MIB_IFROW mibEntry; HKEY hKey; + DHCP_PNP_EVENT PnpEvent; ConResPrintf(StdOut, IDS_HEADER); @@ -1313,8 +1315,31 @@ SetClassId( if (pszClassId == NULL) pszClassId = L""; - RegSetValueExW(hKey, L"DhcpClassId", 0, REG_SZ, (LPBYTE)pszClassId, (wcslen(pszClassId) + 1) * sizeof(WCHAR)); + ret = RegSetValueExW(hKey, L"DhcpClassId", 0, REG_SZ, (LPBYTE)pszClassId, (wcslen(pszClassId) + 1) * sizeof(WCHAR)); RegCloseKey(hKey); + if (ret != ERROR_SUCCESS) + { + ConResPrintf(StdOut, IDS_DHCPSETIDERROR, szFriendlyName); + DoFormatMessage(ret); + goto done; + } + + mbstowcs(szUnicodeAdapterName, pFoundAdapter->AdapterName, strlen(pFoundAdapter->AdapterName) + 1); + + ZeroMemory(&PnpEvent, sizeof(PnpEvent)); + PnpEvent.Unknown5 = 1; + + ret = DhcpHandlePnPEvent(0, + 1, + szUnicodeAdapterName, + &PnpEvent, + 0); + if (ret != ERROR_SUCCESS) + { + ConResPrintf(StdOut, IDS_DHCPSETIDERROR, szFriendlyName); + DoFormatMessage(ret); + goto done; + } ConResPrintf(StdOut, IDS_DHCPSETIDSUCCESS, szFriendlyName); } diff --git a/base/services/dhcpcsvc/dhcpcsvc.c b/base/services/dhcpcsvc/dhcpcsvc.c index dd2bee797bf..3166e4cd7fc 100644 --- a/base/services/dhcpcsvc/dhcpcsvc.c +++ b/base/services/dhcpcsvc/dhcpcsvc.c @@ -8,6 +8,7 @@ #include #include +#include #define NDEBUG #include @@ -168,11 +169,15 @@ DhcpHandlePnPEvent( _In_ DWORD Unknown1, _In_ DWORD Unknown2, _In_ PWSTR AdapterName, - _In_ DWORD Unknown4, + _In_ PDHCP_PNP_EVENT PnpEvent, _In_ DWORD Unknown5) { - DPRINT1("DhcpHandlePnPEvent(%lx %lx %S %lx %lx)\n", - Unknown1, Unknown2, AdapterName, Unknown4, Unknown5); + DPRINT1("DhcpHandlePnPEvent(%lx %lx %S %p %lx)\n", + Unknown1, Unknown2, AdapterName, PnpEvent, Unknown5); + + if ((Unknown1 != 0) || (Unknown2 != 1) || (PnpEvent == NULL) || (Unknown5 != 0)) + return ERROR_INVALID_PARAMETER; + return 0; } diff --git a/sdk/include/psdk/dhcpcapi.h b/sdk/include/psdk/dhcpcapi.h index 6a90f6267de..ec876d9804d 100644 --- a/sdk/include/psdk/dhcpcapi.h +++ b/sdk/include/psdk/dhcpcapi.h @@ -5,6 +5,21 @@ extern "C" { #endif +typedef struct _DHCP_PNP_EVENT +{ + DWORD Unknown1; + DWORD Unknown2; + DWORD Unknown3; + DWORD Unknown4; + DWORD Unknown5; + DWORD Unknown6; + DWORD Unknown7; + DWORD Unknown8; + DWORD Unknown9; + DWORD Unknown10; + DWORD Unknown11; +} DHCP_PNP_EVENT, *PDHCP_PNP_EVENT; + DWORD APIENTRY DhcpAcquireParameters( @@ -24,7 +39,7 @@ DhcpHandlePnPEvent( _In_ DWORD Unknown1, _In_ DWORD Unknown2, _In_ LPWSTR AdapterName, - _In_ DWORD Unknown4, + _In_ PDHCP_PNP_EVENT PnpEvent, _In_ DWORD Unknown5); DWORD