www.pudn.com > windows2000XP_WDM_DeviceDriverDevelopment_WuAnHe_C > CharFilterDll.cpp
// CharFilterDll.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "devinfo.h" #include "CharFilterDll.h" #include "filterinstall.h" #include "CharFilterInst.h" #include///////////////////////////////////////////////////////////////////// // TODO Installation Notes: // // To install the WDM filter driver using this dll, follow these steps: // // 1. The dll copies the .sys file to the system32/drivers folder. The .dll // and .sys should be located in the same folder. // // 2. Use rundll32 to execute the dll exported functions. For installing, // execute 'Install' method like so: // rundll32 CharFilterInst.dll Install // be sure to first change folders to the location of the .dll or // use the full path to the .dll as a parameter to rundll32. // // 3. If the driver is not started, a system reboot is likely required. // // 4. To uninstall, follow step 2 except use Uninstall as a parameter to // rundll32 instead of Install. // ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // DllMain // // Routine Description: // This function is the primary entry point of the dll. // BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } ///////////////////////////////////////////////////////////////////// // Install // // Routine Description: // This function is exported by the dll. The function installs // the WDM filter driver using the CharFilterInstaller class. // // Return Value: // DWORD - Returns ERROR_SUCCESS if no errors are encountered. // Returns ERROR_SUCCESS_REBOOT_REQUIRED if a reboot is // required to start the driver. // // Comments: // FILTERDLL_API DWORD Install(void) { // Instance the object will which will install the filter driver CharFilterInstaller FilterInst; DWORD Status = ERROR_SUCCESS; TCHAR Buff[MAX_PATH]; memset(&Buff,0,MAX_PATH*sizeof(TCHAR)); if (!GetWindowsDirectory(Buff, MAX_PATH)) { Status = ERROR_NOT_ENOUGH_MEMORY; return Status; } size_t len = _tcslen(Buff) + _tcslen(_T("\\")) + _tcslen(FilterInst.m_szFilterBinary) + 1; LPTSTR lpNewFileName = new TCHAR[len]; if (!lpNewFileName) { Status = ERROR_NOT_ENOUGH_MEMORY; return Status; } memset(lpNewFileName,0,len*sizeof(TCHAR)); _tcscpy(lpNewFileName,Buff); _tcscpy(lpNewFileName+_tcslen(Buff),_T("\\")); _tcscpy(lpNewFileName+_tcslen(Buff)+_tcslen(_T("\\")),FilterInst.m_szFilterBinary); // Copy the driver file to system32/drivers BOOL bRet = CopyFile( FilterInst.m_pszFilterSys, // name of an existing file lpNewFileName, // name of new file FALSE // operation if file exists ); if (FALSE == bRet) { Status = GetLastError(); } else { // Install the filter's service key if (!CDeviceInfo::m_WinVer.IsWin9x()) Status = FilterInst.AddService(); if (ERROR_SUCCESS == Status || ERROR_SERVICE_EXISTS == Status) { // Install the filter driver Status = FilterInst.InstallFilter(); // Check if a reboot is required if ((ERROR_SUCCESS == Status) && (FilterInst.IsRebootRequired())) Status = ERROR_SUCCESS_REBOOT_REQUIRED; } } delete lpNewFileName; return Status; } ///////////////////////////////////////////////////////////////////// // Uninstall // // Routine Description: // This function is exported by the dll. The function uninstalls // the WDM filter driver using the CharFilterInstaller class. // // Return Value: // DWORD - Returns ERROR_SUCCESS if no errors are encountered. // Returns DI_NEEDRESTART if a reboot is // required to stop the driver. // // Comments: // FILTERDLL_API DWORD Uninstall(void) { // Instance the object will which will uninstall the filter driver CharFilterInstaller FilterInst; DWORD Status = FilterInst.UninstallFilter(); // See if a reboot is required if ((ERROR_SUCCESS == Status) && (FilterInst.IsRebootRequired())) Status = DI_NEEDRESTART; // Remove the service key for the filter driver if (!CDeviceInfo::m_WinVer.IsWin9x()) FilterInst.RemoveService(); return Status; }