firewallfhk_src

  • qiwewqlin
    了解作者
  • C/C++
    开发工具
  • 47.8KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2022-12-09 08:55
    上传日期
windows fire wall .
firewallfhk_src.zip
  • res
  • CVS
  • Root
    38B
  • Repository
    34B
  • Entries.Extra
    103B
  • Entries
    258B
  • Toolbar.bmp
    1.1KB
  • FirewallApp.rc2
    403B
  • newtoolbar.bmp
    5.8KB
  • FirewallAppDoc.ico
    1.1KB
  • FirewallApp.ico
    1.1KB
  • resource.h
    1.7KB
  • FirewallAppDoc.h
    1.9KB
  • FirewallApp.cpp
    4.2KB
  • DrvFltIp.h
    2.9KB
  • FirewallAppView.cpp
    5.6KB
  • FirewallApp.rc
    14.7KB
  • FirewallApp.dsp
    5.1KB
  • RuleDlg.h
    1.5KB
  • TDriver.cpp
    14.2KB
  • sockUtil.cpp
    1.8KB
  • sockutil.h
    207B
  • FirewallApp.h
    1.4KB
  • FirewallApp.clw
    3.5KB
  • FirewallApp.dsw
    547B
  • FirewallAppDoc.cpp
    3.2KB
  • MainFrm.h
    2.5KB
  • FirewallAppView.h
    2.5KB
  • DrvFltIp.sys
    7KB
  • StdAfx.cpp
    213B
  • rules.h
    330B
  • MainFrm.cpp
    9.7KB
  • StdAfx.h
    1KB
  • TDriver.h
    2.8KB
  • Firewall.exe
    52KB
  • RuleDlg.cpp
    2.6KB
内容介绍
#include "stdafx.h" #include "TDriver.h" //Constructor. Inicializacion de variables. TDriver::TDriver(void) { driverHandle = NULL; removable = TRUE; driverName = NULL; driverPath = NULL; driverDosName = NULL; initialized = FALSE; loaded = FALSE; started = FALSE; } //Destructor. Libera recursos. TDriver::~TDriver(void) { if(driverHandle != NULL) { CloseHandle(driverHandle); driverHandle = NULL; } UnloadDriver(); } //Si removable = TRUE, no se descarga el driver en la "destruccion" del objeto void TDriver::SetRemovable(BOOL value) { removable = value; } // Esta inicializado el driver? BOOL TDriver::IsInitialized(void) { return initialized; } // Esta cargado el driver? BOOL TDriver::IsLoaded(void) { return loaded; } // Esta en estado Start el driver? BOOL TDriver::IsStarted(void) { return started; } // Inicia las variables del driver DWORD TDriver::InitDriver(LPCTSTR path) { // Si ya esta cargado primero lo descargo if(initialized) { if(UnloadDriver() != DRV_SUCCESS) return DRV_ERROR_ALREADY_INITIALIZED; } // Reservo memoria para almacenar el path del driver driverPath = (LPTSTR)malloc(strlen(path) + 1); if(driverPath == NULL) return DRV_ERROR_MEMORY; strcpy(driverPath, path); // Voy a extraer el nombre del driver //Primero busco el caracter '\' LPTSTR sPos1 = strrchr(driverPath, (int)'\\'); // Si no existe, me loco al principio if (sPos1 == NULL) sPos1 = driverPath; // Ahora busco la extension .sys LPTSTR sPos2 = strrchr(sPos1, (int)'.'); // Si no tiene extension .sys salgo sin hacer nada mas if (sPos2 == NULL || sPos1 > sPos2) { free(driverPath); driverPath = NULL; return DRV_ERROR_INVALID_PATH_OR_FILE; } // Me quedo con el nombre del driver driverName = (LPTSTR) malloc (sPos2 - sPos1); if(driverName == NULL) { free(driverPath); driverPath = NULL; return DRV_ERROR_MEMORY; } // Copio los caracteres memcpy(driverName, sPos1 + 1, sPos2 - sPos1 - 1); driverName[sPos2 - sPos1 - 1] = 0; //driverDosName = \\.\driverName driverDosName = (LPTSTR) malloc (strlen(driverName) + 5); if(driverDosName == NULL) { free(driverPath); driverPath = NULL; free(driverName); driverName = NULL; return DRV_ERROR_MEMORY; } sprintf(driverDosName, "\\\\.\\%s", driverName); initialized = TRUE; return DRV_SUCCESS; } // Inicia las variables del driver DWORD TDriver::InitDriver(LPCTSTR name, LPCTSTR path, LPCTSTR dosName) { // Si ya esta cargado primero lo descargo if(initialized) { if(UnloadDriver() != DRV_SUCCESS) return DRV_ERROR_ALREADY_INITIALIZED; } LPTSTR dirBuffer; // Compruebo si el usuario introdujo un path if (path != NULL) { // Lo copio en un buffer auxiliar para su posterior procesamiento DWORD len = (DWORD)(strlen(name) + strlen(path) + 1); dirBuffer = (LPTSTR) malloc (len); if(dirBuffer == NULL) return DRV_ERROR_MEMORY; strcpy(dirBuffer, path); } else { // Si no tenemos path, supongo el directorio actual LPTSTR pathBuffer; DWORD len = GetCurrentDirectory(0, NULL); pathBuffer = (LPTSTR) malloc (len); if(pathBuffer == NULL) return DRV_ERROR_MEMORY; if (GetCurrentDirectory(len, pathBuffer) != 0) { len = (DWORD)(strlen(pathBuffer) + strlen(name) + 6); dirBuffer = (LPTSTR) malloc (len); if(dirBuffer == NULL) { free(pathBuffer); return DRV_ERROR_MEMORY; } // Path = directorio\driverName.sys sprintf(dirBuffer, "%s\\%s.sys", pathBuffer, name); // Compruebo si existe el fichero en cuestion if(GetFileAttributes(dirBuffer) == 0xFFFFFFFF) { free(pathBuffer); free(dirBuffer); // Si no existe, busco en system32\Drivers LPCTSTR sysDriver = "\\system32\\Drivers\\"; LPTSTR sysPath; DWORD len = GetWindowsDirectory(NULL, 0); sysPath = (LPTSTR) malloc (len + strlen(sysDriver)); if(sysPath == NULL) return DRV_ERROR_MEMORY; if (GetWindowsDirectory(sysPath, len) == 0) { free(sysPath); return DRV_ERROR_UNKNOWN; } // Completo el path y compruebo si existe el fichero de nuevo strcat(sysPath, sysDriver); len = (DWORD)(strlen(sysPath) + strlen(name) + 5); dirBuffer = (LPTSTR) malloc (len); if(dirBuffer == NULL) return DRV_ERROR_MEMORY; sprintf(dirBuffer, "%s%s.sys", sysPath, name); free(sysPath); // Si el fichero no existe, salgo if(GetFileAttributes(dirBuffer) == 0xFFFFFFFF) { free(dirBuffer); return DRV_ERROR_INVALID_PATH_OR_FILE; } } free(pathBuffer); } else { free(pathBuffer); return DRV_ERROR_UNKNOWN; } } // Escribo las variables del driver driverPath = dirBuffer; driverName = (LPTSTR)malloc(strlen(name) + 1); if(driverName == NULL) { free(driverPath); driverPath = NULL; return DRV_ERROR_MEMORY; } strcpy(driverName, name); LPCTSTR auxBuffer; if(dosName != NULL) auxBuffer = dosName; else auxBuffer = name; //dosName=\\.\driverName if(auxBuffer[0] != '\\' && auxBuffer[1] != '\\') { driverDosName = (LPTSTR) malloc (strlen(auxBuffer) + 5); if(driverDosName == NULL) { free(driverPath); driverPath = NULL; free(driverName); driverName = NULL; return DRV_ERROR_MEMORY; } sprintf(driverDosName, "\\\\.\\%s", auxBuffer); } else { driverDosName = (LPTSTR) malloc (strlen(auxBuffer)); if(driverDosName == NULL) { free(driverPath); driverPath = NULL; free(driverName); driverName = NULL; return DRV_ERROR_MEMORY; } strcpy(driverDosName, auxBuffer); } // Pongo el estado en inicializado initialized = TRUE; return DRV_SUCCESS; } // Funcion para cargar el driver. DWORD TDriver::LoadDriver(LPCTSTR name, LPCTSTR path, LPCTSTR dosName, BOOL start) { // Primero es necesario inicializarlo DWORD retCode = InitDriver(name, path, dosName); // Despues lo cargo if(retCode == DRV_SUCCESS) retCode = LoadDriver(start); return retCode; } // Funcion para cargar el driver DWORD TDriver::LoadDriver(LPCTSTR path, BOOL start) { // Primero lo inicializo DWORD retCode = InitDriver(path); // Despues lo cargo if(retCode == DRV_SUCCESS) retCode = LoadDriver(start); return retCode; } // Funcion para cargar el driver DWORD TDriver::LoadDriver(BOOL start) { // Si ya esta cargado no hago nada if(loaded) return DRV_SUCCESS; if(!initialized) return DRV_ERROR_NO_INITIALIZED; // Abro el Service Manager para crear el nuevo driver SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); DWORD retCode = DRV_SUCCESS; if (SCManager == NULL) return DRV_ERROR_SCM; // Creo el driver ("Servicio") SC_HANDLE SCService = CreateService(SCManager, // SCManager database driverName, // nombre del servicio driverName, // nombre a mostrar SERVICE_ALL_ACCESS, // acceso total SERVICE_KERNEL_DRIVER, // driver del kernel SERVICE_DEMAND_START, // comienzo bajo demanda SERVICE_ERROR_NORMAL, // control de errores normal driverPath, // path del driver NULL, // no pertenece a un grupo NULL, // sin tag NULL, // sin dependencias NULL, // cuenta local del sistema NULL // sin password ); // Si no puedo crearlo, miro si es porque ya fue cargado por otro proceso. if (SCService == NULL) { SCServ
评论
    相关推荐