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
31 #define WINE_MOUNTMGR_EXTENSIONS
32 #include "ddk/mountmgr.h"
34 #include "wine/debug.h"
35 #include "wine/heap.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(dhcpcsvc
);
39 void WINAPI
DhcpCApiCleanup(void)
44 DWORD WINAPI
DhcpCApiInitialize(LPDWORD version
)
46 *version
= 2; /* 98, XP, and 8 */
51 static DWORD
get_adapter_luid( const WCHAR
*adapter
, NET_LUID
*luid
)
57 if (adapter
[0] == '{')
59 RtlInitUnicodeString( &ustr
, adapter
);
60 status
= RtlGUIDFromString( &ustr
, &guid
);
61 if (!status
) return ConvertInterfaceGuidToLuid( &guid
, luid
);
63 return ConvertInterfaceNameToLuidW( adapter
, luid
);
66 #define IF_NAMESIZE 16
67 static DWORD
get_adapter_name( const WCHAR
*adapter
, char *unix_name
, DWORD len
)
69 WCHAR unix_nameW
[IF_NAMESIZE
];
73 if ((ret
= get_adapter_luid( adapter
, &luid
))) return ret
;
74 if ((ret
= ConvertInterfaceLuidToAlias( &luid
, unix_nameW
, ARRAY_SIZE(unix_nameW
) ))) return ret
;
75 if (!WideCharToMultiByte( CP_UNIXCP
, 0, unix_nameW
, -1, unix_name
, len
, NULL
, NULL
))
76 return ERROR_INVALID_PARAMETER
;
80 DWORD WINAPI
DhcpRequestParams( DWORD flags
, void *reserved
, WCHAR
*adapter
, DHCPCAPI_CLASSID
*class_id
,
81 DHCPCAPI_PARAMS_ARRAY send_params
, DHCPCAPI_PARAMS_ARRAY recv_params
, BYTE
*buf
,
82 DWORD
*buflen
, WCHAR
*request_id
)
84 struct mountmgr_dhcp_request_params
*query
;
88 char unix_name
[IF_NAMESIZE
];
90 TRACE( "(%08lx, %p, %s, %p, %lu, %lu, %p, %p, %s)\n", flags
, reserved
, debugstr_w(adapter
), class_id
,
91 send_params
.nParams
, recv_params
.nParams
, buf
, buflen
, debugstr_w(request_id
) );
93 if (!adapter
|| !buflen
) return ERROR_INVALID_PARAMETER
;
94 if (flags
!= DHCPCAPI_REQUEST_SYNCHRONOUS
) FIXME( "unsupported flags %08lx\n", flags
);
95 if ((err
= get_adapter_name( adapter
, unix_name
, sizeof(unix_name
) ))) return err
;
97 for (i
= 0; i
< send_params
.nParams
; i
++)
98 FIXME( "send option %lu not supported\n", send_params
.Params
->OptionId
);
100 mgr
= CreateFileW( MOUNTMGR_DOS_DEVICE_NAME
, GENERIC_READ
|GENERIC_WRITE
, FILE_SHARE_READ
|FILE_SHARE_WRITE
, NULL
,
101 OPEN_EXISTING
, 0, 0 );
102 if (mgr
== INVALID_HANDLE_VALUE
) return GetLastError();
104 size
= FIELD_OFFSET(struct mountmgr_dhcp_request_params
, params
[recv_params
.nParams
]) + *buflen
;
105 if (!(query
= heap_alloc_zero( size
)))
107 err
= ERROR_OUTOFMEMORY
;
110 for (i
= 0; i
< recv_params
.nParams
; i
++) query
->params
[i
].id
= recv_params
.Params
[i
].OptionId
;
111 query
->count
= recv_params
.nParams
;
112 strcpy( query
->unix_name
, unix_name
);
114 if (!DeviceIoControl( mgr
, IOCTL_MOUNTMGR_QUERY_DHCP_REQUEST_PARAMS
, query
, size
, query
, size
, NULL
, NULL
))
116 err
= GetLastError();
117 if (err
== ERROR_MORE_DATA
) *buflen
= query
->size
- (size
- *buflen
);
122 for (i
= 0; i
< query
->count
; i
++)
126 recv_params
.Params
[i
].OptionId
= query
->params
[i
].id
;
127 recv_params
.Params
[i
].IsVendor
= FALSE
; /* FIXME */
128 if (query
->params
[i
].size
)
130 src
= (BYTE
*)query
+ query
->params
[i
].offset
;
131 memcpy( dst
, src
, query
->params
[i
].size
);
133 recv_params
.Params
[i
].Data
= dst
;
134 recv_params
.Params
[i
].nBytesData
= query
->params
[i
].size
;
138 recv_params
.Params
[i
].Data
= NULL
;
139 recv_params
.Params
[i
].nBytesData
= 0;
142 dst
+= query
->params
[i
].size
;