#include "precomp.h" DWORD WINAPI ServiceStart( LPVOID lparam); DWORD WINAPI InitWirelessPolicy (void); BOOL Is_Whistler_Home_Edition () { OSVERSIONINFOEX osvi; DWORDLONG dwlConditionMask = 0; // Initialize the OSVERSIONINFOEX structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); //osvi.dwMajorVersion = 5; //osvi.dwMinorVersion = 1; osvi.wSuiteMask = VER_SUITE_PERSONAL; // Initialize the condition mask. /* VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, VER_EQUAL ); VER_SET_CONDITION( dwlConditionMask, VER_MINORVERSION, VER_EQUAL ); VER_SET_CONDITION( dwlConditionMask, VER_PRODUCT_TYPE, VER_EQUAL ); */ VER_SET_CONDITION( dwlConditionMask, VER_SUITENAME, VER_AND ); // Perform the test. return VerifyVersionInfo( &osvi, VER_SUITENAME, dwlConditionMask ); } DWORD InitPolicyEngine(DWORD dwParam, HANDLE * hThread) { DWORD dwError = 0; DWORD dwLocThreadId; HANDLE hLocThread = NULL; WiFiTrcInit(); if (Is_Whistler_Home_Edition()) { _WirelessDbg(TRC_ERR, "Policy Engine Not Starting :: This is Home Edition "); return(dwError); } dwError = InitWirelessPolicy(); BAIL_ON_WIN32_ERROR(dwError); _WirelessDbg(TRC_TRACK, "Starting the Policy Engine in a New Thread "); hLocThread = CreateThread( NULL, // no security attributes 0, // use default stack size ServiceStart, // thread function &dwParam, // argument to thread function 0, // use default creation flags &dwLocThreadId); // returns the thread identifier if (hThread == NULL) { _WirelessDbg(TRC_ERR, "CreateThread failed." ); dwError = GetLastError(); } BAIL_ON_WIN32_ERROR(dwError); *hThread = hLocThread; // Set the flag that Policy Engine is Initialized gdwWirelessPolicyEngineInited = 1; return(dwError); error: // State Cleanup Here ClearPolicyStateBlock( gpWirelessPolicyState ); ClearSPDGlobals(); WiFiTrcTerm(); return(dwError); } DWORD TerminatePolicyEngine(HANDLE hThread) { DWORD dwError =0; DWORD dwExitCode = 0; // send appropriate Event .... if (Is_Whistler_Home_Edition()) { _WirelessDbg(TRC_ERR, "Policy Engine Not Started :: This is Home Edition "); WiFiTrcTerm(); return(dwError); } if (!gdwWirelessPolicyEngineInited) { // Policy Engine was not started. No need to do cleanup; return(ERROR_NOT_SUPPORTED); } if (!SetEvent(ghPolicyEngineStopEvent)) { dwError = GetLastError(); BAIL_ON_WIN32_ERROR(dwError); } dwError = WaitForSingleObject(hThread, INFINITE); if (dwError) { _WirelessDbg(TRC_ERR, "Wait Failed "); } BAIL_ON_WIN32_ERROR(dwError); _WirelessDbg(TRC_TRACK, "Thread Exited "); error: CloseHandle(hThread); ClearPolicyStateBlock( gpWirelessPolicyState ); ClearSPDGlobals(); WiFiTrcTerm(); // Set that the wireless Policy Engine has been non-inited gdwWirelessPolicyEngineInited = 0; return(dwError); } DWORD ReApplyPolicy8021x(void) { DWORD dwError =0; if (ghReApplyPolicy8021x == NULL) { dwError = ERROR_INVALID_STATE; _WirelessDbg(TRC_ERR, "Policy Loop Not Initialized Yet "); return(dwError); } _WirelessDbg(TRC_TRACK, " ReApplyPolicy8021x called "); // send appropriate Event .... if (!SetEvent(ghReApplyPolicy8021x)) { dwError = GetLastError(); } return(dwError); }