2 * Copyright 2011 Stefan Leichter
3 * Copyright 2019 Hans Leidekker for CodeWeavers
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #define WINE_MOUNTMGR_EXTENSIONS
26 #include "ddk/mountmgr.h"
28 #include "wine/debug.h"
29 #include "wine/heap.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(dhcpcsvc
);
33 void WINAPI
DhcpCApiCleanup(void)
38 DWORD WINAPI
DhcpCApiInitialize(LPDWORD version
)
40 *version
= 2; /* 98, XP, and 8 */
45 DWORD WINAPI
DhcpRequestParams( DWORD flags
, void *reserved
, WCHAR
*adapter
, DHCPCAPI_CLASSID
*class_id
,
46 DHCPCAPI_PARAMS_ARRAY send_params
, DHCPCAPI_PARAMS_ARRAY recv_params
, BYTE
*buf
,
47 DWORD
*buflen
, WCHAR
*request_id
)
49 struct mountmgr_dhcp_request_params
*query
;
50 DWORD i
, size
, err
= ERROR_OUTOFMEMORY
;
54 TRACE( "(%08x, %p, %s, %p, %u, %u, %p, %p, %s)\n", flags
, reserved
, debugstr_w(adapter
), class_id
,
55 send_params
.nParams
, recv_params
.nParams
, buf
, buflen
, debugstr_w(request_id
) );
57 if (!adapter
|| lstrlenW(adapter
) > IF_MAX_STRING_SIZE
|| !buflen
) return ERROR_INVALID_PARAMETER
;
58 if (flags
!= DHCPCAPI_REQUEST_SYNCHRONOUS
) FIXME( "unsupported flags %08x\n", flags
);
60 for (i
= 0; i
< send_params
.nParams
; i
++)
61 FIXME( "send option %u not supported\n", send_params
.Params
->OptionId
);
63 mgr
= CreateFileW( MOUNTMGR_DOS_DEVICE_NAME
, GENERIC_READ
|GENERIC_WRITE
, FILE_SHARE_READ
|FILE_SHARE_WRITE
, NULL
,
64 OPEN_EXISTING
, 0, 0 );
65 if (mgr
== INVALID_HANDLE_VALUE
) return GetLastError();
67 size
= FIELD_OFFSET(struct mountmgr_dhcp_request_params
, params
[recv_params
.nParams
]) + *buflen
;
68 if (!(query
= heap_alloc_zero( size
))) goto done
;
70 for (i
= 0; i
< recv_params
.nParams
; i
++) query
->params
[i
].id
= recv_params
.Params
[i
].OptionId
;
71 query
->count
= recv_params
.nParams
;
72 lstrcpyW( query
->adapter
, adapter
);
74 if (!DeviceIoControl( mgr
, IOCTL_MOUNTMGR_QUERY_DHCP_REQUEST_PARAMS
, query
, size
, query
, size
, NULL
, NULL
))
77 if (err
== ERROR_MORE_DATA
) *buflen
= query
->size
- (size
- *buflen
);
82 for (i
= 0; i
< query
->count
; i
++)
86 recv_params
.Params
[i
].OptionId
= query
->params
[i
].id
;
87 recv_params
.Params
[i
].IsVendor
= FALSE
; /* FIXME */
88 if (query
->params
[i
].size
)
90 src
= (BYTE
*)query
+ query
->params
[i
].offset
;
91 memcpy( dst
, src
, query
->params
[i
].size
);
93 recv_params
.Params
[i
].Data
= dst
;
94 recv_params
.Params
[i
].nBytesData
= query
->params
[i
].size
;
98 recv_params
.Params
[i
].Data
= NULL
;
99 recv_params
.Params
[i
].nBytesData
= 0;
102 dst
+= query
->params
[i
].size
;