diff --git a/base/services/dhcpcsvc/dhcp/api.c b/base/services/dhcpcsvc/dhcp/api.c index 2a63682d00a..f9bc794cee3 100644 --- a/base/services/dhcpcsvc/dhcp/api.c +++ b/base/services/dhcpcsvc/dhcp/api.c @@ -347,3 +347,20 @@ Server_RemoveDNSRegistrations( /* FIXME: Call dnsapi.DnsRemoveRegistrations() */ return ERROR_SUCCESS; } + + +/* Function 7 */ +DWORD +__stdcall +Server_RequestParams( + _In_ PDHCP_SERVER_NAME ServerName, + _In_ LPWSTR AdapterName, + _In_ DHCPCAPI_CLASSID *ClassId, + _In_ DWORD Unknown4, + _In_ DWORD Unknown5, + _In_ DWORD Unknown6) +{ + DPRINT1("Server_RequestParams(%S %p)\n", AdapterName, ClassId); + UNIMPLEMENTED; + return ERROR_SUCCESS; +} diff --git a/base/services/dhcpcsvc/dhcpcsvc.c b/base/services/dhcpcsvc/dhcpcsvc.c index e6894995f90..97ce6f500df 100644 --- a/base/services/dhcpcsvc/dhcpcsvc.c +++ b/base/services/dhcpcsvc/dhcpcsvc.c @@ -601,7 +601,7 @@ DhcpReleaseParameters( * \return ERROR_SUCCESS on success */ DWORD -WINAPI +APIENTRY DhcpRemoveDNSRegistrations(VOID) { DWORD ret; @@ -621,6 +621,55 @@ DhcpRemoveDNSRegistrations(VOID) return ret; } +DWORD +APIENTRY +DhcpRequestParams( + _In_ DWORD Flags, + _In_ PVOID Reserved, + _In_ LPWSTR AdapterName, + _In_ LPDHCPCAPI_CLASSID ClassId, + _In_ DHCPCAPI_PARAMS_ARRAY SendParams, + _Inout_ DHCPCAPI_PARAMS_ARRAY RecdParams, + _In_ LPBYTE Buffer, + _Inout_ LPDWORD pSize, + _In_ LPWSTR RequestIdStr) +{ + DWORD ret = ERROR_SUCCESS; + + DPRINT1("DhcpRequestParams(%lx %p %S %p %p %p %p %p %S)\n", + Flags, Reserved, AdapterName, ClassId, SendParams, + RecdParams, Buffer, pSize, RequestIdStr); + + if ((Reserved != NULL) || (AdapterName == NULL)) + return ERROR_INVALID_PARAMETER; + + if (ClassId != NULL) + { + if (ClassId->Flags != 0) + return ERROR_INVALID_PARAMETER; + + if ((ClassId->Data == NULL) || (ClassId->nBytesData == 0)) + return ERROR_INVALID_PARAMETER; + } + + RpcTryExcept + { + ret = Client_RequestParams(NULL, + AdapterName, + ClassId, + 0, + 0, + 0); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + ret = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return ret; +} + DWORD APIENTRY DhcpStaticRefreshParams(DWORD AdapterIndex, @@ -644,20 +693,22 @@ DhcpStaticRefreshParams(DWORD AdapterIndex, return (ret == ERROR_SUCCESS) ? 1 : 0; } - -DWORD APIENTRY -DhcpRequestParams(DWORD Flags, - PVOID Reserved, - LPWSTR AdapterName, - LPDHCPCAPI_CLASSID ClassId, - DHCPCAPI_PARAMS_ARRAY SendParams, - DHCPCAPI_PARAMS_ARRAY RecdParams, - LPBYTE Buffer, - LPDWORD pSize, - LPWSTR RequestIdStr) +DWORD +APIENTRY +DhcpUndoRequestParams( + _In_ DWORD Flags, + _In_ LPVOID Reserved, + _In_ LPWSTR AdapterName, + _In_ LPWSTR RequestIdStr) { + DPRINT1("DhcpUndoRequestParams(%lx %p %S %S)\n", + Flags, Reserved, AdapterName, RequestIdStr); + + if ((Flags != 0) || (Reserved != NULL) || (RequestIdStr == NULL)) + return ERROR_INVALID_PARAMETER; + UNIMPLEMENTED; - return 0; + return STATUS_SUCCESS; } static VOID diff --git a/base/services/dhcpcsvc/dhcpcsvc.spec b/base/services/dhcpcsvc/dhcpcsvc.spec index 7843b41b671..5d70c377276 100644 --- a/base/services/dhcpcsvc/dhcpcsvc.spec +++ b/base/services/dhcpcsvc/dhcpcsvc.spec @@ -34,7 +34,7 @@ @ stub DhcpRequestOptions @ stdcall DhcpRequestParams(long ptr ptr ptr long ptr long ptr ptr ptr ptr) @ stdcall DhcpStaticRefreshParams(long long long) -@ stub DhcpUndoRequestParams +@ stdcall DhcpUndoRequestParams(long ptr wstr wstr) @ stub McastApiCleanup @ stub McastApiStartup @ stub McastEnumerateScopes diff --git a/sdk/include/psdk/dhcpcsdk.h b/sdk/include/psdk/dhcpcsdk.h index 6a4b64faea8..6fefc57b2e2 100644 --- a/sdk/include/psdk/dhcpcsdk.h +++ b/sdk/include/psdk/dhcpcsdk.h @@ -92,7 +92,11 @@ typedef struct _DHCPAPI_PARAMS ULONG Flags; ULONG OptionId; BOOL IsVendor; - BYTE *Data; +#if defined(__midl) || defined(__WIDL__) + [size_is(nBytesData), unique] LPBYTE Data; +#else + LPBYTE Data; +#endif DWORD nBytesData; } DHCPAPI_PARAMS, *PDHCPAPI_PARAMS, *LPDHCPAPI_PARAMS; @@ -101,13 +105,21 @@ typedef struct _DHCPAPI_PARAMS DHCPCAPI_PARAMS, *PDHCPCAPI_PARAMS, *LPDHCPCAPI_P typedef struct _DHCPCAPI_PARAMS_ARARAY { ULONG nParams; +#if defined(__midl) || defined(__WIDL__) + [size_is(nParams), unique] LPDHCPCAPI_PARAMS Params; +#else LPDHCPCAPI_PARAMS Params; +#endif } DHCPCAPI_PARAMS_ARRAY, *PDHCPCAPI_PARAMS_ARRAY, *LPDHCPCAPI_PARAMS_ARRAY; typedef struct _DHCPCAPI_CLASSID { ULONG Flags; - BYTE *Data; +#if defined(__midl) || defined(__WIDL__) + [size_is(nBytesData), unique] LPBYTE Data; +#else + LPBYTE Data; +#endif ULONG nBytesData; } DHCPCAPI_CLASSID, *PDHCPCAPI_CLASSID, *LPDHCPCAPI_CLASSID; @@ -117,6 +129,7 @@ typedef struct _DHCPCAPI_CLASSID #define DHCPCAPI_REQUEST_CANCEL 0x8 #define DHCPCAPI_REQUEST_MASK 0xf +#if !defined(__midl) && !defined(__WIDL__) void WINAPI DhcpCApiCleanup(void); DWORD WINAPI DhcpCApiInitialize(DWORD *); DWORD WINAPI DhcpDeRegisterParamChange(DWORD, void *, void *); @@ -125,5 +138,6 @@ DWORD WINAPI DhcpRemoveDNSRegistrations(VOID); DWORD WINAPI DhcpRequestParams(DWORD, void *, WCHAR *, DHCPCAPI_CLASSID *, DHCPCAPI_PARAMS_ARRAY, DHCPCAPI_PARAMS_ARRAY, BYTE *, DWORD *, WCHAR *); DWORD WINAPI DhcpUndoRequestParams(DWORD, LPVOID, LPWSTR, LPWSTR); +#endif #endif diff --git a/sdk/include/reactos/idl/dhcpcsvc.idl b/sdk/include/reactos/idl/dhcpcsvc.idl index bc4289b55ec..4db71233a57 100644 --- a/sdk/include/reactos/idl/dhcpcsvc.idl +++ b/sdk/include/reactos/idl/dhcpcsvc.idl @@ -6,6 +6,19 @@ typedef [handle] wchar_t *PDHCP_SERVER_NAME; +cpp_quote("#ifndef _DHCPCSDK_") +typedef struct _DHCPCAPI_CLASSID +{ + ULONG Flags; +#if defined(__midl) || defined(__WIDL__) + [size_is(nBytesData), unique] LPBYTE Data; +#else + LPBYTE Data; +#endif + ULONG nBytesData; +} DHCPCAPI_CLASSID, *PDHCPCAPI_CLASSID, *LPDHCPCAPI_CLASSID; +cpp_quote("#endif") + [ uuid(4D5839D6-01BC-559C-B2EC-7DF12EC1B7E6), version(0.0), @@ -70,4 +83,15 @@ interface dhcpcsvc __stdcall RemoveDNSRegistrations( [in, string, unique] PDHCP_SERVER_NAME ServerName); + + /* Function 7 */ + DWORD + __stdcall + RequestParams( + [in, unique, string] PDHCP_SERVER_NAME ServerName, + [in, string] LPWSTR AdapterName, + [in, unique] DHCPCAPI_CLASSID *ClassId, + [in] DWORD Unknown4, + [in] DWORD Unknown5, + [in] DWORD Unknown6); }