windows-nt/Source/XPSP1/NT/net/layer2svc/wlpolicy/main.c
2020-09-26 16:20:57 +08:00

193 lines
3.9 KiB
C

#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);
}