www.pudn.com > WINCEOS.zip > bthns.cxx
// // Copyright (c) Microsoft Corporation. All rights reserved. // // // This source code is licensed under Microsoft Shared Source License // Version 1.0 for Windows CE. // For a copy of the license visit http://go.microsoft.com/fwlink/?LinkId=3223. // //------------------------------------------------------------------------------ // // Bluetooth Name Space Layer // // // Module Name: // // bthns.cxx // // Abstract: // // This file implements the Name Space provider. This name space provider // lives in btd.dll and is called by Winsock2 during WSASetService // and WSALookup calls. // // //------------------------------------------------------------------------------ #include#include #include #include #include #define BTHNS_THREAD_SAFTEY 0 #if 0 #if BTHNS_THREAD_SAFTEY // Currently there is no need for any thread saftey at this level, // leaving code in place (#ifdef'd out) in case this changes. // Note that if this is added, would need to be placed in btdrt.dll's DllMain. CRITICAL_SECTION g_bthNsCritSec; static int g_cStartups; #endif BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved) { #if BTHNS_THREAD_SAFTEY switch (dwReason) { case DLL_PROCESS_ATTACH: g_cStartups = 0; InitializeCriticalSection(&g_bthNsCritSec); DisableThreadLibraryCalls ((HMODULE)hInstance); break; case DLL_PROCESS_DETACH: DeleteCriticalSection(&g_bthNsCritSec); break; default: break; } #endif // BTHNS_THREAD_SAFTEY return TRUE; } #endif // 0 int WINAPI BTH_NSPCleanup(LPGUID lpProviderId) { #if BTHNS_THREAD_SAFTEY int iError = ERROR_SUCCESS; __try { if (memcmp(lpProviderId, &NsId, sizeof(GUID))) iError = WSAEINVAL; else { EnterCriticalSection(&g_bthNsCritSec); g_cStartups--; if (g_cStartups == 0) { // cleanup - currently nothing is allocated at this layer. } LeaveCriticalSection(&g_bthNsCritSec); } } __except (EXCEPTION_EXECUTE_HANDLER) { iError = WSAEFAULT; } if (iError) { SetLastError(iError); iError = SOCKET_ERROR; } return iError; #else return ERROR_SUCCESS; #endif // BTHNS_THREAD_SAFTEY } int WSAAPI BTH_NSPSetServiceThunk(LPGUID lpProviderId, LPWSASERVICECLASSINFOW lpServiceClassInfo, LPWSAQUERYSETW lpqsRegInfo, WSAESETSERVICEOP essOperation, DWORD dwControlFlags) { return BthNsSetService(lpqsRegInfo,essOperation,dwControlFlags); } int WSAAPI BTH_NSPLookupServiceBeginThunk(LPGUID pProviderId, LPWSAQUERYSETW pRestrict, LPWSASERVICECLASSINFOW pServiceClass, DWORD ControlFlags, LPHANDLE phLookup) { return BthNsLookupServiceBegin(pRestrict,ControlFlags,phLookup); } int WSAAPI BTH_NSPLookupServiceNextThunk(HANDLE hLookup, DWORD ControlFlags, DWORD *pcBuf, LPWSAQUERYSETW pResults) { return BthNsLookupServiceNext(hLookup,ControlFlags,pcBuf,pResults); } int WINAPI BTH_NSPLookupServiceEndThunk(HANDLE hLookup) { return BthNsLookupServiceEnd(hLookup); } int WSAAPI BTH_NSPRemoveServiceClass(LPGUID pProviderId, LPGUID lpServiceClassId) { ASSERT(0); SetLastError(WSAEOPNOTSUPP); return SOCKET_ERROR; } int WSAAPI BTH_NSPGetServiceClassInfo(LPGUID lpProviderId, LPDWORD lpdwBufSize, LPWSASERVICECLASSINFOW lpServiceClass) { ASSERT(0); SetLastError(WSAEOPNOTSUPP); return SOCKET_ERROR; } int WSAAPI BTH_NSPIoctlThunk(HANDLE hLookup, DWORD dwControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned, LPWSACOMPLETION lpCompletion, LPWSATHREADID lpThreadId) { ASSERT(0); SetLastError(WSAEOPNOTSUPP); return SOCKET_ERROR; } int WINAPI BTH_NSPInstallServiceClass(LPGUID pProviderId, PWSASERVICECLASSINFOW pServiceClassInfo) { ASSERT(0); SetLastError( WSAEOPNOTSUPP ); return( SOCKET_ERROR ); } // // Called during name space provider installation. // int WSAAPI NSPStartup(LPGUID lpProviderId, LPNSP_ROUTINE lpnspRoutines) { int iError = ERROR_SUCCESS; __try { // should we check the provider id??? // NSPIoctl was apparently newly added so size they give us may not // include it if (lpnspRoutines->cbSize < ((int)(&(((NSP_ROUTINE *)0)->NSPIoctl)))) { iError = WSAEINVAL; } else { lpnspRoutines->dwMajorVersion = 1; lpnspRoutines->dwMinorVersion = 1; lpnspRoutines->NSPCleanup = &BTH_NSPCleanup; lpnspRoutines->NSPLookupServiceBegin = &BTH_NSPLookupServiceBeginThunk; lpnspRoutines->NSPLookupServiceNext = &BTH_NSPLookupServiceNextThunk; lpnspRoutines->NSPLookupServiceEnd = &BTH_NSPLookupServiceEndThunk; lpnspRoutines->NSPSetService = &BTH_NSPSetServiceThunk; lpnspRoutines->NSPInstallServiceClass = &BTH_NSPInstallServiceClass; lpnspRoutines->NSPRemoveServiceClass = &BTH_NSPRemoveServiceClass; lpnspRoutines->NSPGetServiceClassInfo = &BTH_NSPGetServiceClassInfo; #if BTHNS_THREAD_SAFTEY EnterCriticalSection(&g_bthNsCritSec); g_cStartups++; ASSERT(g_cStartups > 0); LeaveCriticalSection(&g_bthNsCritSec); #endif // BTHNS_THREAD_SAFTEY } } __except (EXCEPTION_EXECUTE_HANDLER) { iError = WSAEFAULT; } if (iError) { SetLastError(iError); iError = SOCKET_ERROR; } return iError; }