#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
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
ndis防火墙.rar (34个子文件)
RuleDlg.h 1KB
FirewallApp.h 1KB
StdAfx.cpp 213B
resource.h 2KB
TDriver.h 3KB
Firewall.exe 52KB
FirewallAppView.h 2KB
MainFrm.h 2KB
sockutil.h 207B
FirewallApp.dsw 547B
sockUtil.cpp 2KB
FirewallApp.rc 15KB
FirewallAppDoc.cpp 3KB
StdAfx.h 1KB
FirewallApp.cpp 4KB
rules.h 330B
FirewallApp.clw 4KB
FirewallAppView.cpp 6KB
MainFrm.cpp 10KB
DrvFltIp.sys 7KB
FirewallApp.dsp 5KB
RuleDlg.cpp 3KB
DrvFltIp.h 3KB
res
CVS
Entries 258B
Entries.Extra 103B
Repository 34B
Root 38B
FirewallAppDoc.ico 1KB
FirewallApp.rc2 403B
newtoolbar.bmp 6KB
FirewallApp.ico 1KB
Toolbar.bmp 1KB
TDriver.cpp 14KB
FirewallAppDoc.h 2KB
共 34 条
- 1
tianwailaibin
- 粉丝: 46
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页