Reactos
at listview 634 lines 14 kB view raw
1/* 2 * PROJECT: ReactOS WLAN Service 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: base/services/wlansvc/rpcserver.c 5 * PURPOSE: RPC server interface 6 * COPYRIGHT: Copyright 2009 Christoph von Wittich 7 */ 8 9#include "precomp.h" 10 11#define NDEBUG 12#include <debug.h> 13//#define GET_IF_ENTRY2_IMPLEMENTED 1 14 15LIST_ENTRY WlanSvcHandleListHead; 16 17DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter) 18{ 19 RPC_STATUS Status; 20 21 InitializeListHead(&WlanSvcHandleListHead); 22 23 Status = RpcServerUseProtseqEpW(L"ncalrpc", 20, L"wlansvc", NULL); 24 if (Status != RPC_S_OK) 25 { 26 DPRINT("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status); 27 return 0; 28 } 29 30 Status = RpcServerRegisterIf(wlansvc_interface_v1_0_s_ifspec, NULL, NULL); 31 if (Status != RPC_S_OK) 32 { 33 DPRINT("RpcServerRegisterIf() failed (Status %lx)\n", Status); 34 return 0; 35 } 36 37 Status = RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT, 0); 38 if (Status != RPC_S_OK) 39 { 40 DPRINT("RpcServerListen() failed (Status %lx)\n", Status); 41 } 42 43 DPRINT("RpcServerListen finished\n"); 44 return 0; 45} 46 47PWLANSVCHANDLE WlanSvcGetHandleEntry(LPWLANSVC_RPC_HANDLE ClientHandle) 48{ 49 PLIST_ENTRY CurrentEntry; 50 PWLANSVCHANDLE lpWlanSvcHandle; 51 52 CurrentEntry = WlanSvcHandleListHead.Flink; 53 while (CurrentEntry != &WlanSvcHandleListHead) 54 { 55 lpWlanSvcHandle = CONTAINING_RECORD(CurrentEntry, 56 WLANSVCHANDLE, 57 WlanSvcHandleListEntry); 58 CurrentEntry = CurrentEntry->Flink; 59 60 if (lpWlanSvcHandle == (PWLANSVCHANDLE) ClientHandle) 61 return lpWlanSvcHandle; 62 } 63 64 return NULL; 65} 66 67DWORD _RpcOpenHandle( 68 wchar_t *arg_1, 69 DWORD dwClientVersion, 70 DWORD *pdwNegotiatedVersion, 71 LPWLANSVC_RPC_HANDLE phClientHandle) 72{ 73 PWLANSVCHANDLE lpWlanSvcHandle; 74 75 lpWlanSvcHandle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WLANSVCHANDLE)); 76 if (lpWlanSvcHandle == NULL) 77 { 78 DPRINT1("Failed to allocate Heap!\n"); 79 return ERROR_NOT_ENOUGH_MEMORY; 80 } 81 82 if (dwClientVersion > 2) 83 dwClientVersion = 2; 84 85 if (dwClientVersion < 1) 86 dwClientVersion = 1; 87 88 lpWlanSvcHandle->dwClientVersion = dwClientVersion; 89 *pdwNegotiatedVersion = dwClientVersion; 90 91 InsertTailList(&WlanSvcHandleListHead, &lpWlanSvcHandle->WlanSvcHandleListEntry); 92 *phClientHandle = lpWlanSvcHandle; 93 94 return ERROR_SUCCESS; 95} 96 97DWORD _RpcCloseHandle( 98 LPWLANSVC_RPC_HANDLE phClientHandle) 99{ 100 PWLANSVCHANDLE lpWlanSvcHandle; 101 102 lpWlanSvcHandle = WlanSvcGetHandleEntry(*phClientHandle); 103 if (!lpWlanSvcHandle) 104 { 105 return ERROR_INVALID_HANDLE; 106 } 107 108 RemoveEntryList(&lpWlanSvcHandle->WlanSvcHandleListEntry); 109 HeapFree(GetProcessHeap(), 0, lpWlanSvcHandle); 110 111 return ERROR_SUCCESS; 112} 113 114DWORD _RpcEnumInterfaces( 115 WLANSVC_RPC_HANDLE hClientHandle, 116 PWLAN_INTERFACE_INFO_LIST *ppInterfaceList) 117{ 118#if GET_IF_ENTRY2_IMPLEMENTED 119 DWORD dwNumInterfaces; 120 DWORD dwResult, dwSize; 121 DWORD dwIndex; 122 MIB_IF_ROW2 IfRow; 123 PWLAN_INTERFACE_INFO_LIST InterfaceList; 124 125 dwResult = GetNumberOfInterfaces(&dwNumInterfaces); 126 dwSize = sizeof(WLAN_INTERFACE_INFO_LIST); 127 if (dwResult != NO_ERROR) 128 { 129 /* set num interfaces to zero when an error occurs */ 130 dwNumInterfaces = 0; 131 } 132 else 133 { 134 if (dwNumInterfaces > 1) 135 { 136 /* add extra size for interface */ 137 dwSize += (dwNumInterfaces-1) * sizeof(WLAN_INTERFACE_INFO); 138 } 139 } 140 141 /* allocate interface list */ 142 InterfaceList = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize); 143 if (!InterfaceList) 144 { 145 return ERROR_NOT_ENOUGH_MEMORY; 146 } 147 148 *ppInterfaceList = InterfaceList; 149 if (!dwNumInterfaces) 150 { 151 return ERROR_SUCCESS; 152 } 153 154 for(dwIndex = 0; dwIndex < dwNumInterfaces; dwIndex++) 155 { 156 ZeroMemory(&IfRow, sizeof(MIB_IF_ROW2)); 157 IfRow.InterfaceIndex = dwIndex; 158 159 dwResult = GetIfEntry2(&IfRow); 160 if (dwResult == NO_ERROR) 161 { 162 if (IfRow.Type == IF_TYPE_IEEE80211 && IfRow.InterfaceAndOperStatusFlags.HardwareInterface) 163 { 164 RtlMoveMemory(&InterfaceList->InterfaceInfo[InterfaceList->dwNumberOfItems].InterfaceGuid, &IfRow.InterfaceGuid, sizeof(GUID)); 165 wcscpy(InterfaceList->InterfaceInfo[InterfaceList->dwNumberOfItems].strInterfaceDescription, IfRow.Description); 166 //FIXME set state 167 InterfaceList->dwNumberOfItems++; 168 } 169 } 170 } 171 172 return ERROR_SUCCESS; 173#else 174 UNIMPLEMENTED; 175 return ERROR_CALL_NOT_IMPLEMENTED; 176#endif 177} 178 179DWORD _RpcSetAutoConfigParameter( 180 WLANSVC_RPC_HANDLE hClientHandle, 181 long OpCode, 182 DWORD dwDataSize, 183 LPBYTE pData) 184{ 185 UNIMPLEMENTED; 186 return ERROR_CALL_NOT_IMPLEMENTED; 187} 188 189DWORD _RpcQueryAutoConfigParameter( 190 WLANSVC_RPC_HANDLE hClientHandle, 191 DWORD OpCode, 192 LPDWORD pdwDataSize, 193 char **ppData, 194 DWORD *pWlanOpcodeValueType) 195{ 196 UNIMPLEMENTED; 197 return ERROR_CALL_NOT_IMPLEMENTED; 198} 199 200DWORD _RpcGetInterfaceCapability( 201 WLANSVC_RPC_HANDLE hClientHandle, 202 const GUID *pInterfaceGuid, 203 PWLAN_INTERFACE_CAPABILITY *ppCapability) 204{ 205 PWLANSVCHANDLE lpWlanSvcHandle; 206 207 lpWlanSvcHandle = WlanSvcGetHandleEntry(hClientHandle); 208 if (!lpWlanSvcHandle) 209 { 210 return ERROR_INVALID_HANDLE; 211 } 212 213 UNIMPLEMENTED; 214 return ERROR_CALL_NOT_IMPLEMENTED; 215} 216 217DWORD _RpcSetInterface( 218 WLANSVC_RPC_HANDLE hClientHandle, 219 const GUID *pInterfaceGuid, 220 DWORD OpCode, 221 DWORD dwDataSize, 222 LPBYTE pData) 223{ 224 UNIMPLEMENTED; 225 return ERROR_CALL_NOT_IMPLEMENTED; 226} 227 228DWORD _RpcQueryInterface( 229 WLANSVC_RPC_HANDLE hClientHandle, 230 const GUID *pInterfaceGuid, 231 long OpCode, 232 LPDWORD pdwDataSize, 233 LPBYTE *ppData, 234 LPDWORD pWlanOpcodeValueType) 235{ 236 UNIMPLEMENTED; 237 return ERROR_CALL_NOT_IMPLEMENTED; 238} 239 240DWORD _RpcIhvControl( 241 WLANSVC_RPC_HANDLE hClientHandle, 242 const GUID *pInterfaceGuid, 243 DWORD Type, 244 DWORD dwInBufferSize, 245 LPBYTE pInBuffer, 246 DWORD dwOutBufferSize, 247 LPBYTE pOutBuffer, 248 LPDWORD pdwBytesReturned) 249{ 250 UNIMPLEMENTED; 251 return ERROR_CALL_NOT_IMPLEMENTED; 252} 253 254DWORD _RpcScan( 255 WLANSVC_RPC_HANDLE hClientHandle, 256 const GUID *pInterfaceGuid, 257 PDOT11_SSID pDot11Ssid, 258 PWLAN_RAW_DATA pIeData) 259{ 260 PWLANSVCHANDLE lpWlanSvcHandle; 261 262 lpWlanSvcHandle = WlanSvcGetHandleEntry(hClientHandle); 263 if (!lpWlanSvcHandle) 264 { 265 return ERROR_INVALID_HANDLE; 266 } 267 268 /* 269 DWORD dwBytesReturned; 270 HANDLE hDevice; 271 ULONG OidCode = OID_802_11_BSSID_LIST_SCAN; 272 PNDIS_802_11_BSSID_LIST pBssIDList; 273 274 DeviceIoControl(hDevice, 275 IOCTL_NDIS_QUERY_GLOBAL_STATS, 276 &OidCode, 277 sizeof(ULONG), 278 NULL, 279 0, 280 &dwBytesReturned, 281 NULL); 282*/ 283 UNIMPLEMENTED; 284 return ERROR_CALL_NOT_IMPLEMENTED; 285} 286 287DWORD _RpcGetAvailableNetworkList( 288 WLANSVC_RPC_HANDLE hClientHandle, 289 const GUID *pInterfaceGuid, 290 DWORD dwFlags, 291 WLAN_AVAILABLE_NETWORK_LIST **ppAvailableNetworkList) 292{ 293 UNIMPLEMENTED; 294 return ERROR_CALL_NOT_IMPLEMENTED; 295} 296 297DWORD _RpcGetNetworkBssList( 298 WLANSVC_RPC_HANDLE hClientHandle, 299 const GUID *pInterfaceGuid, 300 PDOT11_SSID pDot11Ssid, 301 short dot11BssType, 302 DWORD bSecurityEnabled, 303 LPDWORD dwBssListSize, 304 LPBYTE *ppWlanBssList) 305{ 306 UNIMPLEMENTED; 307 return ERROR_CALL_NOT_IMPLEMENTED; 308} 309 310DWORD _RpcConnect( 311 WLANSVC_RPC_HANDLE hClientHandle, 312 const GUID *pInterfaceGuid, 313 const PWLAN_CONNECTION_PARAMETERS *pConnectionParameters) 314{ 315 UNIMPLEMENTED; 316 return ERROR_CALL_NOT_IMPLEMENTED; 317} 318 319DWORD _RpcDisconnect( 320 WLANSVC_RPC_HANDLE hClientHandle, 321 const GUID *pInterfaceGUID) 322{ 323 UNIMPLEMENTED; 324 return ERROR_CALL_NOT_IMPLEMENTED; 325} 326 327DWORD _RpcRegisterNotification( 328 WLANSVC_RPC_HANDLE hClientHandle, 329 DWORD arg_2, 330 LPDWORD pdwPrevNotifSource) 331{ 332 UNIMPLEMENTED; 333 return ERROR_CALL_NOT_IMPLEMENTED; 334} 335 336DWORD _RpcAsyncGetNotification( 337 WLANSVC_RPC_HANDLE hClientHandle, 338 PWLAN_NOTIFICATION_DATA *NotificationData) 339{ 340 UNIMPLEMENTED; 341 return ERROR_CALL_NOT_IMPLEMENTED; 342} 343 344DWORD _RpcSetProfileEapUserData( 345 WLANSVC_RPC_HANDLE hClientHandle, 346 const GUID *pInterfaceGuid, 347 wchar_t *strProfileName, 348 EAP_METHOD_TYPE MethodType, 349 DWORD dwFlags, 350 DWORD dwEapUserDataSize, 351 LPBYTE pbEapUserData) 352{ 353 UNIMPLEMENTED; 354 return ERROR_CALL_NOT_IMPLEMENTED; 355} 356 357DWORD _RpcSetProfile( 358 WLANSVC_RPC_HANDLE hClientHandle, 359 const GUID *pInterfaceGuid, 360 DWORD dwFlags, 361 wchar_t *strProfileXml, 362 wchar_t *strAllUserProfileSecurity, 363 BOOL bOverwrite, 364 LPDWORD pdwReasonCode) 365{ 366 UNIMPLEMENTED; 367 return ERROR_CALL_NOT_IMPLEMENTED; 368} 369 370DWORD _RpcGetProfile( 371 WLANSVC_RPC_HANDLE hClientHandle, 372 const GUID *pInterfaceGuid, 373 wchar_t *strProfileName, 374 wchar_t **pstrProfileXml, 375 LPDWORD pdwFlags, 376 LPDWORD pdwGrantedAccess) 377{ 378 UNIMPLEMENTED; 379 return ERROR_CALL_NOT_IMPLEMENTED; 380} 381 382DWORD _RpcDeleteProfile( 383 WLANSVC_RPC_HANDLE hClientHandle, 384 const GUID *pInterfaceGuid, 385 const wchar_t *strProfileName) 386{ 387 UNIMPLEMENTED; 388 return ERROR_CALL_NOT_IMPLEMENTED; 389} 390 391DWORD _RpcRenameProfile( 392 WLANSVC_RPC_HANDLE hClientHandle, 393 const GUID *pInterfaceGuid, 394 const wchar_t *strOldProfileName, 395 const wchar_t *strNewProfileName) 396{ 397 UNIMPLEMENTED; 398 return ERROR_CALL_NOT_IMPLEMENTED; 399} 400 401DWORD _RpcSetProfileList( 402 WLANSVC_RPC_HANDLE hClientHandle, 403 const GUID *pInterfaceGuid, 404 DWORD dwItems, 405 BYTE **strProfileNames) 406{ 407 UNIMPLEMENTED; 408 return ERROR_CALL_NOT_IMPLEMENTED; 409} 410 411DWORD _RpcGetProfileList( 412 WLANSVC_RPC_HANDLE hClientHandle, 413 const GUID *pInterfaceGuid, 414 PWLAN_PROFILE_INFO_LIST *ppProfileList) 415{ 416 UNIMPLEMENTED; 417 return ERROR_CALL_NOT_IMPLEMENTED; 418} 419 420DWORD _RpcSetProfilePosition( 421 WLANSVC_RPC_HANDLE hClientHandle, 422 const GUID *pInterfaceGuid, 423 wchar_t *strProfileName, 424 DWORD dwPosition) 425{ 426 UNIMPLEMENTED; 427 return ERROR_CALL_NOT_IMPLEMENTED; 428} 429 430DWORD _RpcSetProfileCustomUserData( 431 WLANSVC_RPC_HANDLE hClientHandle, 432 const GUID *pInterfaceGuid, 433 wchar_t *strProfileName, 434 DWORD dwDataSize, 435 LPBYTE pData) 436{ 437 UNIMPLEMENTED; 438 return ERROR_CALL_NOT_IMPLEMENTED; 439} 440 441DWORD _RpcGetProfileCustomUserData( 442 WLANSVC_RPC_HANDLE hClientHandle, 443 const GUID *pInterfaceGuid, 444 wchar_t *strProfileName, 445 LPDWORD dwDataSize, 446 LPBYTE *pData) 447{ 448 UNIMPLEMENTED; 449 return ERROR_CALL_NOT_IMPLEMENTED; 450} 451 452DWORD _RpcSetFilterList( 453 WLANSVC_RPC_HANDLE hClientHandle, 454 short wlanFilterListType, 455 PDOT11_NETWORK_LIST pNetworkList) 456{ 457 UNIMPLEMENTED; 458 return ERROR_CALL_NOT_IMPLEMENTED; 459} 460 461DWORD _RpcGetFilterList( 462 WLANSVC_RPC_HANDLE hClientHandle, 463 short wlanFilterListType, 464 PDOT11_NETWORK_LIST *pNetworkList) 465{ 466 UNIMPLEMENTED; 467 return ERROR_CALL_NOT_IMPLEMENTED; 468} 469 470DWORD _RpcSetPsdIEDataList( 471 WLANSVC_RPC_HANDLE hClientHandle, 472 wchar_t *strFormat, 473 DWORD dwDataListSize, 474 LPBYTE pPsdIEDataList) 475{ 476 UNIMPLEMENTED; 477 return ERROR_CALL_NOT_IMPLEMENTED; 478} 479 480DWORD _RpcSaveTemporaryProfile( 481 WLANSVC_RPC_HANDLE hClientHandle, 482 const GUID *pInterfaceGuid, 483 wchar_t *strProfileName, 484 wchar_t *strAllUserProfileSecurity, 485 DWORD dwFlags, 486 BOOL bOverWrite) 487{ 488 UNIMPLEMENTED; 489 return ERROR_CALL_NOT_IMPLEMENTED; 490} 491 492DWORD _RpcIsUIRequestPending( 493 wchar_t *arg_1, 494 const GUID *pInterfaceGuid, 495 struct_C *arg_3, 496 LPDWORD arg_4) 497{ 498 UNIMPLEMENTED; 499 return ERROR_CALL_NOT_IMPLEMENTED; 500} 501 502DWORD _RpcSetUIForwardingNetworkList( 503 wchar_t *arg_1, 504 GUID *arg_2, 505 DWORD dwSize, 506 GUID *arg_4) 507{ 508 UNIMPLEMENTED; 509 return ERROR_CALL_NOT_IMPLEMENTED; 510} 511 512DWORD _RpcIsNetworkSuppressed( 513 wchar_t *arg_1, 514 DWORD arg_2, 515 const GUID *pInterfaceGuid, 516 LPDWORD arg_4) 517{ 518 UNIMPLEMENTED; 519 return ERROR_CALL_NOT_IMPLEMENTED; 520} 521 522DWORD _RpcRemoveUIForwardingNetworkList( 523 wchar_t *arg_1, 524 const GUID *pInterfaceGuid) 525{ 526 UNIMPLEMENTED; 527 return ERROR_CALL_NOT_IMPLEMENTED; 528} 529 530DWORD _RpcQueryExtUIRequest( 531 wchar_t *arg_1, 532 GUID *arg_2, 533 GUID *arg_3, 534 short arg_4, 535 GUID *pInterfaceGuid, 536 struct_C **arg_6) 537{ 538 UNIMPLEMENTED; 539 return ERROR_CALL_NOT_IMPLEMENTED; 540} 541 542DWORD _RpcUIResponse( 543 wchar_t *arg_1, 544 struct_C *arg_2, 545 struct_D *arg_3) 546{ 547 UNIMPLEMENTED; 548 return ERROR_CALL_NOT_IMPLEMENTED; 549} 550 551DWORD _RpcGetProfileKeyInfo( 552 wchar_t *arg_1, 553 DWORD arg_2, 554 const GUID *pInterfaceGuid, 555 wchar_t *arg_4, 556 DWORD arg_5, 557 LPDWORD arg_6, 558 char *arg_7, 559 LPDWORD arg_8) 560{ 561 UNIMPLEMENTED; 562 return ERROR_CALL_NOT_IMPLEMENTED; 563} 564 565DWORD _RpcAsyncDoPlap( 566 wchar_t *arg_1, 567 const GUID *pInterfaceGuid, 568 wchar_t *arg_3, 569 DWORD dwSize, 570 struct_E arg_5[]) 571{ 572 UNIMPLEMENTED; 573 return ERROR_CALL_NOT_IMPLEMENTED; 574} 575 576DWORD _RpcQueryPlapCredentials( 577 wchar_t *arg_1, 578 LPDWORD dwSize, 579 struct_E **arg_3, 580 wchar_t **arg_4, 581 GUID *pInterfaceGuid, 582 LPDWORD arg_6, 583 LPDWORD arg_7, 584 LPDWORD arg_8, 585 LPDWORD arg_9) 586{ 587 UNIMPLEMENTED; 588 return ERROR_CALL_NOT_IMPLEMENTED; 589} 590 591DWORD _RpcCancelPlap( 592 wchar_t *arg_1, 593 const GUID *pInterfaceGuid) 594{ 595 UNIMPLEMENTED; 596 return ERROR_CALL_NOT_IMPLEMENTED; 597} 598 599DWORD _RpcSetSecuritySettings( 600 WLANSVC_RPC_HANDLE hClientHandle, 601 WLAN_SECURABLE_OBJECT SecurableObject, 602 const wchar_t *strModifiedSDDL) 603{ 604 UNIMPLEMENTED; 605 return ERROR_CALL_NOT_IMPLEMENTED; 606} 607 608DWORD _RpcGetSecuritySettings( 609 WLANSVC_RPC_HANDLE hClientHandle, 610 WLAN_SECURABLE_OBJECT SecurableObject, 611 WLAN_OPCODE_VALUE_TYPE *pValueType, 612 wchar_t **pstrCurrentSDDL, 613 LPDWORD pdwGrantedAccess) 614{ 615 UNIMPLEMENTED; 616 return ERROR_CALL_NOT_IMPLEMENTED; 617} 618 619void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len) 620{ 621 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); 622} 623 624 625void __RPC_USER midl_user_free(void __RPC_FAR * ptr) 626{ 627 HeapFree(GetProcessHeap(), 0, ptr); 628} 629 630 631void __RPC_USER WLANSVC_RPC_HANDLE_rundown(WLANSVC_RPC_HANDLE hClientHandle) 632{ 633} 634