亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tdriver.cpp

?? 關于一個驅動的測試代碼
?? CPP
字號:
//if you use this code in a mfc program:
//add the header stdafx.h or disable precompiled header
//Unless you do it, when compiling  vc will say: Unexpected end 
//of file while looking for precompiled header

#include "stdafx.h"

#include "TDriver.h"


//Constructor. Initialize variables.
TDriver::TDriver(void)
{
	driverHandle = NULL;
	   
	removable = TRUE;

	driverName = NULL;
	driverPath = NULL;
	driverDosName = NULL;

	initialized = FALSE;
	loaded = FALSE;
	started = FALSE;
}


//Destructor. Free resources and unload the driver.
TDriver::~TDriver(void)
{
	if(driverHandle != NULL)
	{
		CloseHandle(driverHandle); 
		driverHandle = NULL; 
	}
   
    UnloadDriver();
}

//If removable = TRUE, the driver isnt unload when exit
void TDriver::SetRemovable(BOOL value)
{
	removable = value;
}


//is driver initialized?
BOOL TDriver::IsInitialized(void)
{
	return initialized;
}

//is driver loaded?
BOOL TDriver::IsLoaded(void)
{
	return loaded;
}

//is driver started?
BOOL TDriver::IsStarted(void)
{
	return started;
}


//Init the driver class variables
DWORD TDriver::InitDriver(LPCTSTR path)
{
	//if already initialized, first unload
	if(initialized)
	{
		if(UnloadDriver() != DRV_SUCCESS)
			return DRV_ERROR_ALREADY_INITIALIZED;
	}

	//if yes, i analized the path to extract driver name
	driverPath = (LPTSTR)malloc(strlen(path) + 1);

	if(driverPath == NULL)
		return DRV_ERROR_MEMORY;

	strcpy(driverPath, path);


	//first i search the last backslash
	LPTSTR sPos1 = strrchr(driverPath, (int)'\\');

	//if null, the string havent any backslash
	if (sPos1 == NULL)
		sPos1 = driverPath;


	//now, i search .sys
	LPTSTR sPos2 = strrchr(sPos1, (int)'.');

	if (sPos2 == NULL || sPos1 > sPos2)
	{
		free(driverPath);
		driverPath = NULL;

		return DRV_ERROR_INVALID_PATH_OR_FILE;
	}
	
	//extract the driver name
	driverName = (LPTSTR) malloc (sPos2 - sPos1);
	
	if(driverName == NULL)
	{
		free(driverPath);
		driverPath = NULL;

		return DRV_ERROR_MEMORY;
	}

	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;
}


//Init the driver class variables
DWORD TDriver::InitDriver(LPCTSTR name, LPCTSTR path, LPCTSTR dosName)
{	
	//if already initialized, first unload
	if(initialized)
	{
		if(UnloadDriver() != DRV_SUCCESS)
			return DRV_ERROR_ALREADY_INITIALIZED;
	}

	LPTSTR dirBuffer;

	//if the user introduced path, first i will ckeck it
	if (path != NULL) 
	{
		//if yes, copy in auxiliar buffer and continue
		DWORD len = (DWORD)(strlen(name) + strlen(path) + 1);
		dirBuffer = (LPTSTR) malloc (len);

		if(dirBuffer == NULL)
			return DRV_ERROR_MEMORY;

		strcpy(dirBuffer, path);

	}

	else 
	{
		//if the user dont introduced path, i search in curren directory
		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;
			}

			//complete de total path, currentdirectory\driverName.sys
			sprintf(dirBuffer, "%s\\%s.sys", pathBuffer, name);

			//exists this file?
			if(GetFileAttributes(dirBuffer) == 0xFFFFFFFF)
			{
				free(pathBuffer);
				free(dirBuffer);

				//if no, i search in \system32\drivers\ 
				LPCTSTR sysDriver = "\\system32\\Drivers\\";
				LPTSTR sysPath;
	    	    
				//i have to get the windows directory
				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;
				}
	
				//complete the path and check it
				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);

				//if the file neither exist, i dont know where is it -> i dont initialize
				if(GetFileAttributes(dirBuffer) == 0xFFFFFFFF)
				{
					free(dirBuffer);

					return DRV_ERROR_INVALID_PATH_OR_FILE;
				}
			}
        }

		else
		{
			free(pathBuffer);

			return DRV_ERROR_UNKNOWN;
		}
	}
	
	//Write driver's variables with obtained data
	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);
	}

	//set the state to initialized
	initialized = TRUE;

	return DRV_SUCCESS;
}


//Function to Load the driver.
DWORD TDriver::LoadDriver(LPCTSTR name, LPCTSTR path, LPCTSTR dosName, BOOL start)
{
	//first initialized it
	DWORD retCode = InitDriver(name, path, dosName);

	//then load
	if(retCode == DRV_SUCCESS)
		retCode = LoadDriver(start);

	return retCode;
}

//Function to load the driver
DWORD TDriver::LoadDriver(LPCTSTR path, BOOL start)
{
	//first initialized it
	DWORD retCode = InitDriver(path);

	//then load
	if(retCode == DRV_SUCCESS)
		retCode = LoadDriver(start);

	return retCode;
}


//Function to Load the driver
DWORD TDriver::LoadDriver(BOOL start)
{
	//if the driver is already started, i havent to do nothing
	if(loaded)
		return DRV_SUCCESS;

	if(!initialized)
		return DRV_ERROR_NO_INITIALIZED;

	//Open Service manager to create the new "service"
	SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	DWORD retCode = DRV_SUCCESS;
	
	if (SCManager == NULL) 
		return DRV_ERROR_SCM;

    

    //Create the driver "service"
    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
										 );
    
	//if i cant create, first i check if the driver already was loaded.
	if (SCService == NULL) 
	{
		SCService = OpenService(SCManager, driverName, SERVICE_ALL_ACCESS);
		
		if (SCService == NULL) 
			retCode = DRV_ERROR_SERVICE;
	}

    CloseServiceHandle(SCService);
	SCService=NULL;

	CloseServiceHandle(SCManager);
	SCManager = NULL;

	//if all ok, update the state and start if necessary
	if(retCode == DRV_SUCCESS)
	{
		loaded = TRUE;

		if(start)
			retCode = StartDriver();
	}

	return retCode;
}


//Function to Unload a driver
DWORD TDriver::UnloadDriver(BOOL forceClearData)
{
	DWORD retCode = DRV_SUCCESS;

	//if the driver is started, first i will stop it
	if (started)
	{
		if ((retCode = StopDriver()) == DRV_SUCCESS) 
		{
			//i only remove it, if it is mark to be removable
			if(removable)
			{
				//open service and delete it
				SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
				
				if (SCManager == NULL) 
					return DRV_ERROR_SCM;

				SC_HANDLE SCService = OpenService(SCManager, driverName, SERVICE_ALL_ACCESS);
				
				if (SCService != NULL)
				{
					if(!DeleteService(SCService))
						retCode = DRV_ERROR_REMOVING;
					else
						retCode = DRV_SUCCESS;
				}

				else
					retCode = DRV_ERROR_SERVICE;

				CloseServiceHandle(SCService);
				SCService = NULL;

				CloseServiceHandle(SCManager);
				SCManager = NULL;

				//if all ok, update the state
				if(retCode == DRV_SUCCESS)
					loaded = FALSE;
			}
		}
	}

	//if the driver is initialized...
	if(initialized) 
	{
		//if there was some problem but i mark foreceClear, i will remove the data
		if(retCode != DRV_SUCCESS && forceClearData == FALSE)
			return retCode;
		
		//update the state
		initialized = FALSE;
				
		//free memory
		if(driverPath != NULL)
		{
			free(driverPath);
			driverPath = NULL;
		}


		if(driverDosName != NULL)
		{
			free(driverDosName);
			driverDosName = NULL;
		}

		if(driverName != NULL)
		{
			free(driverName);
			driverName = NULL;
		}

	}

	return retCode;
}



//Function to start the driver "service"
DWORD TDriver::StartDriver(void)
{
	//if already started, all ok
	if(started)
		return DRV_SUCCESS;

	//open the service manager and the service and change driver state
	SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	DWORD retCode;
	
	if (SCManager == NULL) 
		return DRV_ERROR_SCM;

    SC_HANDLE SCService = OpenService(SCManager,
		                              driverName,
				                      SERVICE_ALL_ACCESS);
    
	if (SCService == NULL) 
        return DRV_ERROR_SERVICE;

    
    if (!StartService( SCService, 0, NULL)) 
	{
		//if the driver was started before i try to do it,
		//i will not remove, because it was created by other application
        if (GetLastError() == ERROR_SERVICE_ALREADY_RUNNING) 
		{
			removable = FALSE;

			retCode = DRV_SUCCESS;
		}

		else
			retCode = DRV_ERROR_STARTING;
    }

	else
		retCode = DRV_SUCCESS;

  
    CloseServiceHandle(SCService);
	SCService = NULL;

	CloseServiceHandle(SCManager);
	SCManager = NULL;

	//update the state and open device
	if(retCode == DRV_SUCCESS)
	{
		started = TRUE;

		retCode = OpenDevice();
	}

    return retCode;
}



//Function to stop driver "service"
DWORD TDriver::StopDriver(void)
{
	//if already stopped, all ok
	if(!started)
		return DRV_SUCCESS;

	//open the service manager and the service and change driver state
	SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	DWORD retCode;
	
	if (SCManager == NULL) 
		return DRV_ERROR_SCM;

   
    SERVICE_STATUS  status;

    SC_HANDLE SCService = OpenService(SCManager, driverName, SERVICE_ALL_ACCESS);
    
	if (SCService != NULL)
	{
		//close the driver handle too
		CloseHandle(driverHandle); 
		driverHandle = NULL; 

		if(!ControlService(SCService, SERVICE_CONTROL_STOP, &status))
			retCode = DRV_ERROR_STOPPING;

		else
			retCode = DRV_SUCCESS;
	}

	else
		retCode = DRV_ERROR_SERVICE;


    CloseServiceHandle(SCService);
	SCService = NULL;

	CloseServiceHandle(SCManager);
	SCManager = NULL;

	//update the state
	if(retCode == DRV_SUCCESS)
		started = FALSE;

    return retCode;
}


//Funtion to open a driver handle
DWORD TDriver::OpenDevice(void)
{
	//if i already have a handle, first close it
	if (driverHandle != NULL) 
		CloseHandle(driverHandle);

    driverHandle = CreateFile(driverDosName,
							  GENERIC_READ | GENERIC_WRITE,
							  0,
                              NULL,
                              OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL,
                              NULL);


    if(driverHandle == INVALID_HANDLE_VALUE)
		return DRV_ERROR_INVALID_HANDLE;
	
	return DRV_SUCCESS;
}


//Return the driverHandle obtained
HANDLE TDriver::GetDriverHandle(void)
{
	return driverHandle;
}


//Funtion to send data to the driver
DWORD TDriver::WriteIo(DWORD code, PVOID buffer, DWORD count)
{
	if(driverHandle == NULL)
		return DRV_ERROR_INVALID_HANDLE;

	DWORD bytesReturned;

	BOOL returnCode = DeviceIoControl(driverHandle,
								      code,
								      buffer,
								      count,
								      NULL,
								      0,
								      &bytesReturned,
								      NULL);

	if(!returnCode)
		return DRV_ERROR_IO;

	return DRV_SUCCESS;
}


//Functions to read data from the driver
DWORD TDriver::ReadIo(DWORD code, PVOID buffer, DWORD count)
{
	if(driverHandle == NULL)
		return DRV_ERROR_INVALID_HANDLE;

	DWORD bytesReturned;
	BOOL retCode = DeviceIoControl(driverHandle,
								   code,
								   NULL,
								   0,
								   buffer,
								   count,
								   &bytesReturned,
								   NULL);

	if(!retCode)
		return DRV_ERROR_IO;

	return bytesReturned;
}


//Function to do IO operation with the driver, read or write or both
DWORD TDriver::RawIo(DWORD code, PVOID inBuffer, DWORD inCount, PVOID outBuffer, DWORD outCount)
{
	if(driverHandle == NULL)
		return DRV_ERROR_INVALID_HANDLE;

	DWORD bytesReturned;
	BOOL retCode = DeviceIoControl(driverHandle,
								   code,
								   inBuffer,
								   inCount,
								   outBuffer,
								   outCount,
								   &bytesReturned,
								   NULL);

	if(!retCode)
		return DRV_ERROR_IO;

	return bytesReturned;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合视频在线观看| 最新欧美精品一区二区三区| 丝袜美腿亚洲色图| 在线播放/欧美激情| 日韩国产欧美在线视频| 日韩欧美成人午夜| 国产成人在线免费| 亚洲欧洲av另类| 欧美色窝79yyyycom| 日韩中文欧美在线| 久久久久久综合| 91污在线观看| 日韩精品91亚洲二区在线观看| 日韩欧美成人激情| 成人av电影在线| 三级不卡在线观看| 国产日产欧美精品一区二区三区| 99国产精品视频免费观看| 亚洲成av人**亚洲成av**| 日韩欧美不卡一区| 色呦呦一区二区三区| 美国三级日本三级久久99| 国产亚洲美州欧州综合国| 日本道色综合久久| 国内精品久久久久影院薰衣草| 自拍视频在线观看一区二区| 宅男噜噜噜66一区二区66| 国产成a人亚洲| 午夜欧美2019年伦理| 国产三级精品视频| 欧美另类高清zo欧美| 国产精品亚洲一区二区三区在线| 亚洲码国产岛国毛片在线| 精品少妇一区二区三区在线播放 | 亚洲欧洲成人自拍| 欧美电影在线免费观看| 波多野结衣中文字幕一区 | 色婷婷久久久亚洲一区二区三区 | 中文文精品字幕一区二区| 欧美中文字幕久久| 国产成人精品亚洲午夜麻豆| 午夜一区二区三区视频| 国产精品沙发午睡系列990531| 欧美巨大另类极品videosbest| 大陆成人av片| 看片的网站亚洲| 亚洲成人av免费| 亚洲欧美国产三级| 国产精品美女www爽爽爽| 欧美一区二区三区精品| 欧洲精品在线观看| 97精品久久久午夜一区二区三区 | 色综合久久综合| 国产成人av一区二区三区在线观看| 香蕉成人伊视频在线观看| 17c精品麻豆一区二区免费| 国产蜜臀av在线一区二区三区| 欧美一区二区三区系列电影| 在线观看一区二区视频| 99re亚洲国产精品| 成人听书哪个软件好| 国产伦精品一区二区三区视频青涩| 日本系列欧美系列| 亚洲1区2区3区4区| 亚洲大片在线观看| 亚洲五码中文字幕| 亚洲一区二区三区影院| 亚洲激情男女视频| 一区二区三区产品免费精品久久75| 中文字幕精品一区二区三区精品 | 精品噜噜噜噜久久久久久久久试看 | 久久久久久久久久久久久久久99| 欧美一区二区观看视频| 7777女厕盗摄久久久| 欧美一区二区精美| 欧美mv日韩mv国产网站app| 精品成人在线观看| www久久久久| 久久久蜜臀国产一区二区| 久久网站最新地址| 国产欧美日韩另类视频免费观看| 国产三级一区二区| 国产精品入口麻豆原神| 亚洲色图在线看| 亚洲夂夂婷婷色拍ww47| 婷婷开心久久网| 麻豆91在线播放| 精品亚洲成a人| 高清视频一区二区| 色久综合一二码| 制服.丝袜.亚洲.另类.中文| 日韩美女视频在线| 中日韩av电影| 亚洲免费三区一区二区| 亚洲成av人片在www色猫咪| 丝袜诱惑亚洲看片| 国产福利电影一区二区三区| 91蜜桃视频在线| 欧美一区二区三区小说| 欧美经典一区二区| 亚洲乱码国产乱码精品精98午夜| 亚洲电影激情视频网站| 久久国产精品99精品国产 | 色爱区综合激月婷婷| 欧美日韩精品久久久| 欧美mv日韩mv国产网站| 亚洲欧洲性图库| 视频一区视频二区在线观看| 国内精品视频666| 在线免费观看成人短视频| 日韩免费看网站| 专区另类欧美日韩| 蜜臀av亚洲一区中文字幕| 成人黄色大片在线观看| 在线观看91av| 国产精品免费丝袜| 美腿丝袜亚洲综合| 99久久综合国产精品| 欧美一区二区人人喊爽| 中文字幕日本乱码精品影院| 日本vs亚洲vs韩国一区三区 | 99久久久国产精品| 欧美一级高清大全免费观看| 亚洲欧美综合网| 国产乱码精品一区二区三区五月婷 | 日精品一区二区| 99re亚洲国产精品| 久久亚洲一级片| 午夜不卡在线视频| 不卡一区中文字幕| 久久蜜桃香蕉精品一区二区三区| 一区二区三区久久久| 国产99久久久国产精品潘金| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲成人免费在线观看| 成人小视频在线| 日韩区在线观看| 亚洲成人中文在线| 99精品国产99久久久久久白柏| 欧美成人在线直播| 午夜精品一区二区三区电影天堂 | 久久精品人人做| 日韩电影一区二区三区四区| 色一情一伦一子一伦一区| 国产无人区一区二区三区| 久久99久久精品欧美| 欧美精品国产精品| 亚洲午夜电影在线| 91久久久免费一区二区| 国产精品拍天天在线| 国产一区二区不卡在线| 欧美不卡激情三级在线观看| 日韩中文字幕一区二区三区| 欧美日韩精品电影| 亚洲第一成年网| 欧美日韩大陆在线| 天天综合网天天综合色| 欧美性猛片aaaaaaa做受| 亚洲一区二区三区三| 欧美系列在线观看| 亚洲高清中文字幕| 精品污污网站免费看| 亚洲动漫第一页| 欧美色精品在线视频| 亚洲成av人片在线| 这里只有精品电影| 免费观看在线综合| 日韩一区二区三区视频在线| 久久99国内精品| 久久精品人人做人人爽人人| 国产福利视频一区二区三区| 国产精品美日韩| 91在线丨porny丨国产| 亚洲精品国久久99热| 欧美综合一区二区三区| 亚洲va国产天堂va久久en| 欧美一区二区三区四区高清| 久久国产精品露脸对白| 久久精品一区二区三区不卡牛牛 | 色成年激情久久综合| 亚洲高清视频中文字幕| 欧美伦理电影网| 久久精品国产久精国产| 国产精品午夜在线观看| 日本韩国欧美一区二区三区| 婷婷国产v国产偷v亚洲高清| 日韩欧美一区在线| 国产91精品露脸国语对白| 亚洲欧美福利一区二区| 欧美一区二区视频网站| 国产91丝袜在线观看| 一区二区三区欧美在线观看| 777xxx欧美| 成人av午夜电影| 亚洲国产成人高清精品| 欧美精品一区二区三区蜜桃| www.亚洲免费av| 午夜精品福利一区二区蜜股av| 精品av综合导航| 色八戒一区二区三区|