#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
herrylou
- 粉丝: 2
- 资源: 1
最新资源
- 硕飞烧录器上位机软件及nand flash制作烧录文件及烧录方法
- genad-hGridSample-test.hbm
- 通信原理(第七版 樊昌信 曹丽娜)思维导图
- 基于python的网络爬虫爬取天气数据及可视化分析python大作业源码
- 老鼠图像目标检测数据【已标注,约1100张数据,YOLO 标注格式】
- 简易制作java1.8环境的docker镜像包arm64
- C#课程的最终大作业,个人Blog带db数据库文件winform
- 技术册投标文件的的查重
- J6上板测试模型,原始版本
- 基于python的网络爬虫爬取天气数据及可视化分析系统源码
- 基于 springboot+vue 的高校宿舍管理系统设计与实现 前端:Vue3 后端Springboot 数据库MySQL 含参考Word 可作为毕设参考,项目完整拿来即用 有数据库文件
- 基于java的商城积分系统(编号:90821116).zip
- 基于Java的电影院售票管理系统(编号:63808153).zip
- 基于java的电缆行业生产管理系统(编号:474342100).zip
- 基于java的网上订餐系统(编号:96717170).zip
- 基于python的网络爬虫爬取天气数据及可视化分析项目源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈