//////////////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // //////////////////////////////////////////////////////////////////////////////////////// #include "globals.h" #include #include #include "classfac.h" #include #include #include "wmiprov.h" extern BOOL APIENTRY DllMain (HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpReserved) ; DWORD g_InstanceRegister = 0 ; DWORD g_EventRegister = 0 ; STDAPI DllRegisterServer () ; STDAPI DllUnregisterServer () ; BOOL s_Exiting = FALSE ; LONG CALLBACK WindowsMainProc ( HWND a_hWnd , UINT a_message , WPARAM a_wParam , LPARAM a_lParam ) { long t_rc = 0 ; switch ( a_message ) { case WM_CLOSE: { s_Exiting = TRUE ; } break ; case WM_DESTROY: { PostMessage ( a_hWnd , WM_QUIT , 0 , 0 ) ; } break ; default: { t_rc = DefWindowProc ( a_hWnd , a_message , a_wParam , a_lParam ) ; } break ; } return ( t_rc ) ; } HWND WindowsInit ( HINSTANCE a_HInstance ) { static wchar_t *t_TemplateCode = L"WDM Provider" ; WNDCLASS t_wc ; t_wc.style = CS_HREDRAW | CS_VREDRAW ; t_wc.lpfnWndProc = WindowsMainProc ; t_wc.cbClsExtra = 0 ; t_wc.cbWndExtra = 0 ; t_wc.hInstance = a_HInstance ; t_wc.hIcon = LoadIcon(NULL, IDI_HAND) ; t_wc.hCursor = LoadCursor(NULL, IDC_ARROW) ; t_wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ; t_wc.lpszMenuName = NULL ; t_wc.lpszClassName = t_TemplateCode ; ATOM t_winClass = RegisterClass ( &t_wc ) ; HWND t_HWnd = CreateWindow ( t_TemplateCode , // see RegisterClass() call t_TemplateCode , // text for window title bar WS_OVERLAPPEDWINDOW , // window style CW_USEDEFAULT , // default horizontal position CW_USEDEFAULT , // default vertical position CW_USEDEFAULT , // default width CW_USEDEFAULT , // default height NULL , // overlapped windows have no parent NULL , // use the window class menu a_HInstance , NULL // pointer not needed ) ; ShowWindow ( t_HWnd, SW_SHOW ) ; // ShowWindow ( t_HWnd, SW_HIDE ) ; return t_HWnd ; } void WindowsStop ( HWND a_HWnd ) { CoUninitialize () ; DestroyWindow ( a_HWnd ) ; } HWND WindowsStart ( HINSTANCE a_Handle ) { HWND t_HWnd = NULL ; if ( ! ( t_HWnd = WindowsInit ( a_Handle ) ) ) { } return t_HWnd ; } void WindowsDispatch () { BOOL t_GetMessage ; MSG t_lpMsg ; while ( ( t_GetMessage = GetMessage ( & t_lpMsg , NULL , 0 , 0 ) ) == TRUE ) { TranslateMessage ( & t_lpMsg ) ; DispatchMessage ( & t_lpMsg ) ; if ( s_Exiting ) return ; } } HRESULT UninitComServer () { if ( g_InstanceRegister ) CoRevokeClassObject ( g_InstanceRegister ); CoUninitialize () ; return S_OK ; } HRESULT InitInstanceProvider () { IUnknown *t_ClassFactory = new CProvFactory(CLSID_WMIProvider); DWORD t_ClassContext = CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER ; DWORD t_Flags = REGCLS_MULTIPLEUSE ; HRESULT t_Result = CoRegisterClassObject ( CLSID_WMIProvider , t_ClassFactory, t_ClassContext, t_Flags, &g_InstanceRegister ); return t_Result ; } HRESULT InitEventProvider () { IUnknown *t_ClassFactory = new CProvFactory(CLSID_WMIEventProvider); DWORD t_ClassContext = CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER ; DWORD t_Flags = REGCLS_MULTIPLEUSE ; HRESULT t_Result = CoRegisterClassObject (CLSID_WMIEventProvider, t_ClassFactory, t_ClassContext, t_Flags, &g_EventRegister ); return t_Result ; } HRESULT InitComServer ( DWORD a_AuthenticationLevel , DWORD a_ImpersonationLevel ) { HRESULT t_Result = S_OK ; t_Result = CoInitializeEx ( 0, COINIT_MULTITHREADED ); if ( SUCCEEDED ( t_Result ) ) { t_Result = CoInitializeSecurity ( NULL, -1, NULL, NULL, a_AuthenticationLevel, a_ImpersonationLevel, NULL, EOAC_NONE, 0 ); if ( FAILED ( t_Result ) ) { CoUninitialize () ; return t_Result ; } } if ( SUCCEEDED ( t_Result ) ) t_Result = InitInstanceProvider () ; if ( SUCCEEDED ( t_Result ) ) t_Result = InitEventProvider () ; if ( FAILED ( t_Result ) ) { UninitComServer () ; } return t_Result ; } HRESULT Process () { #if 1 DWORD t_ImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE ; DWORD t_AuthenticationLevel = RPC_C_AUTHN_LEVEL_CONNECT ; #else DWORD t_ImpersonationLevel = RPC_C_IMP_LEVEL_IDENTITY ; DWORD t_AuthenticationLevel = RPC_C_AUTHN_LEVEL_NONE ; #endif HRESULT t_Result = InitComServer ( t_ImpersonationLevel , t_AuthenticationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { WindowsDispatch () ; UninitComServer () ; } return t_Result ; } BOOL ParseCommandLine () { BOOL t_Exit = FALSE ; LPTSTR t_CommandLine = GetCommandLine () ; if ( t_CommandLine ) { TCHAR *t_Arg = NULL ; TCHAR *t_ApplicationArg = NULL ; t_ApplicationArg = _tcstok ( t_CommandLine , _TEXT ( " \t" ) ) ; t_Arg = _tcstok ( NULL , _TEXT ( " \t" ) ) ; if ( t_Arg ) { if ( _tcsicmp ( t_Arg , _TEXT ( "/RegServer" ) ) == 0 ) { t_Exit = TRUE ; DllRegisterServer () ; } else if ( _tcsicmp ( t_Arg , _TEXT ( "/UnRegServer" ) ) == 0 ) { t_Exit = TRUE ; DllUnregisterServer () ; } } } return t_Exit ; } int WINAPI WinMain ( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nShowCmd // show state of window ) { BOOL t_Status = DllMain ( hInstance, DLL_PROCESS_ATTACH , NULL ) ; BOOL t_Exit = ParseCommandLine () ; if ( ! t_Exit ) { HWND hWnd = WindowsStart ( hInstance ) ; HRESULT t_Result = Process () ; WindowsStop ( hWnd ) ; } t_Status = DllMain ( hInstance, DLL_PROCESS_DETACH , NULL ) ; return 0 ; }