⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simpledriver.c

📁 周立功MAGICARM2410开发板配套wince实例源代码
💻 C
字号:

#include <windows.h>
#include <types.h>


static BYTE g_Tmp = 0;						/* 暂存数据变量 */
static DWORD g_OpenCount = 0;				/* 驱动打开计数器 */ 

/*******************************************************************************************
函数名称: DllEntry
描    述: 驱动程序动态库入口
输入参数: 	
输出参数:
返    回: 
*******************************************************************************************/
BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
    switch ( dwReason ) 
	{
		case DLL_PROCESS_ATTACH:
			RETAILMSG(1, (TEXT("SPL: DLL_PROCESS_ATTACH.\r\n")));	/* 提示动态库加载 */
			DisableThreadLibraryCalls((HMODULE) hInstDll);			
			break;

		case DLL_PROCESS_DETACH:
			RETAILMSG(1, (TEXT("SPL: DLL_PROCESS_DETACH.\r\n")));	/* 提示动态库卸载 */
			break;
    }
    
    return (TRUE);
}


/*******************************************************************************************
函数名称: SPL_Init
描    述: 驱动程序初始化函数
输入参数: DWORD dwContext: 设备管理器传递给本驱动的参数, 通常为流接口驱动在注册表内的位置 	
输出参数: 无
返    回: 驱动程序句柄
*******************************************************************************************/
DWORD SPL_Init(DWORD dwContext)
{
	RETAILMSG(1, (TEXT("::: SPL_Init.\r\n")));		/* 提示驱动加载 */

	g_Tmp = 0;										/* 初始化全局变量的值 */
	g_OpenCount = 0; 

	return 1;										/* 返回一个不为零的数表示成功 */
}


/*******************************************************************************************
函数名称: SPL_Deinit
描    述: 驱动程序卸载函数
输入参数: DWORD dwContext: 驱动程序句柄
输出参数: 无
返    回: FALSE: 失败    TRUE: 成功
*******************************************************************************************/
BOOL SPL_Deinit(DWORD dwContext)
{
	RETAILMSG(1, (TEXT("::: SPL_Deinit.\r\n")));	/* 提示驱动卸载 */
	
	g_Tmp = 0;										/* 恢复全局变量的值 */
	g_OpenCount = 0; 

    return TRUE;
}


/*******************************************************************************************
函数名称: SPL_Open
描    述: 打开驱动程序
输入参数: DWORD hDeviceContext: 设备驱动程序引用实例句柄
          DWORD AccessCode    : 访问请求代码,是读和写的组合
          DWORD ShareMode	  : 共享模式  
输出参数:
返    回: 驱动程序引用事例句柄
*******************************************************************************************/
DWORD SPL_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
	RETAILMSG(1, (TEXT("::: SPL_Open.\r\n")));	     /* 提示驱动打开 */
	
	// 不允许多个应用程序打开本驱动
	if (g_OpenCount != 0)
	{
		RETAILMSG(1, (TEXT("SPL Open failed.\r\n")));/* 提示驱动打开失败 */
		return 0;
	}
	g_OpenCount++;								     /* 驱动打开计数器加1 */

    return g_OpenCount;								 /* 必须返回一个不为空的句柄 */
}


/*******************************************************************************************
函数名称: SPL_Close
描    述: 驱动程序关闭函数
输入参数: DWORD hOpenContext:驱动程序引用事例句柄
输出参数: 无
返    回: FALSE: 失败    TRUE: 成功 
*******************************************************************************************/
BOOL SPL_Close(DWORD hOpenContext)
{
	RETAILMSG(1, (TEXT("::: SPL_Close.\r\n")));	     	/* 提示驱动关闭 */
	
	if (g_OpenCount != 0) 
		g_OpenCount--;								 	/* 驱动打开计数减1 */
		
    return TRUE;
}


/*******************************************************************************************
函数名称: SPL_IOControl
描    述: 驱动程序 I/O 请求
输入参数: 
输出参数:
返    回: TRUE: 成功   FALSE: 失败
*******************************************************************************************/
BOOL SPL_IOControl(DWORD hOpenContext,
    			   DWORD dwCode,
				   PBYTE pBufIn,
				   DWORD dwLenIn,
				   PBYTE pBufOut,
				   DWORD dwLenOut,
				   PDWORD pdwActualOut)
{
	RETAILMSG(1, (TEXT("::: SPL_IOControl.\r\n")));		 /* 提示I/O请求函数执行 */
	
	return TRUE;
}


/*******************************************************************************************
函数名称: SPL_Read
描    述: 从本驱动读取数据
输入参数: DWORD hOpenContext: 驱动程序引用事例句柄
          DWORD Count		: 要读的字节数
输出参数: LPVOID pBuffer    : 接收缓冲区
返    回: 实际读到的字节数
*******************************************************************************************/
DWORD SPL_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
	uchar *pReadBuffer;
	
	RETAILMSG(1, (TEXT("::: SPL_Read.\r\n")));			  	/* 提示执行读函数 */
	if ((pBuffer == NULL) || (Count <= 0))
	{													  	/* 读函数入口参数错误 */
		RETAILMSG(1, (TEXT("::: SPL_Read() parameter is error.\r\n")));			
		return 0;
	}
	
	// 映射地址空间
	pReadBuffer = MapPtrToProcess(pBuffer, GetCallerProcess());
	*pReadBuffer = g_Tmp;								  	/* 返回数据 */
	
	return 1;												/* 返回读取的字节数 */
}


/*******************************************************************************************
函数名称: SPL_Write
描    述: 向本驱动写入数据
输入参数: DWORD hOpenContext: 驱动程序引用事例句柄
          LPVOID pBuffer    : 发送缓冲区
          DWORD Count		: 要写入的字节数
输出参数: 无
返    回: 实际写入的字节数
*******************************************************************************************/
DWORD SPL_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count)
{
	uchar *pWriteBuffer;

	RETAILMSG(1, (TEXT("::: SPL_Write.\r\n")));			  	/* 提示执行写函数 */
	if ((pBuffer == NULL) || (Count <= 0))
	{													  	/* 写函数入口参数错误 */
		RETAILMSG(1, (TEXT("::: SPL_Write() parameter is error.\r\n")));			
		return 0;
	}
	
	// 获取应用程序地址空间数据指针
	pWriteBuffer = MapPtrToProcess((LPVOID)pBuffer, GetCallerProcess());
	g_Tmp = *pWriteBuffer;									/* 保存数据 */

	return 1;
}


/*******************************************************************************************
函数名称: SPL_Seek
描    述: 对设备的数据指针进行操作,本驱动不支持该函数
输入参数: 
输出参数:
返    回:
*******************************************************************************************/
DWORD SPL_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
	RETAILMSG(1, (TEXT("::: SPL_Seek.\r\n")));			  	/* 提示执行本函数 */

	return 0;
}


/*******************************************************************************************
函数名称: SPL_PowerUp
描    述: 电源上电驱动处理函数
输入参数: 
输出参数:
返    回: 无
*******************************************************************************************/
void SPL_PowerUp(void)
{
	RETAILMSG(1, (TEXT("::: SPL_PowerUp.\r\n")));			 /* 提示执行本函数 */
}


/*******************************************************************************************
函数名称: SPL_PowerDown
描    述: 电源下电驱动处理函数
输入参数: 
输出参数:
返    回: 无
*******************************************************************************************/
void SPL_PowerDown(void)
{
	RETAILMSG(1, (TEXT("::: SPL_PowerDown.\r\n")));			 /* 提示执行本函数 */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -