先说明一下,以下的文字,并不全是本人自己写的,一大部分是Ctrl+c过来的,写这篇主要是做一下整理,由于写的匆忙,有不对的地方欢迎大家拍砖。
1)DWORD XXX_Init(LPCTSTR pContext, LPCVOID lpvBusContext);
pContext:指向一个字符串,包含注册表中该流接口活动键值的路径,可以通过OpenDeviceKey(pContext)函数获得该驱动的注册表句柄,之后实用相关的API即可对其注册表进行操作;
lpvBusContext:此参数是被处理过的一个指针数据,由函数ActiveDeviceEx 的第四参数lpvParam传递而来(若该对应的驱动由外部ActiveDeviceEx 调用而加载则lpvBusContext被传递过来,否则一般为0)
功能:该函数是驱动挂载后第一个被执行的,一般会在系统初始化时被执行。主要负责完成对设备的初始化操作和驱动的安全性检查。由ActiveDeviceEx通过设备管理器调用。其返回值一般是一个数据指针,一般指向一个自己创建的类或结构体(注意:要使用new来创建,否则返回值会变成野指针。当然使用一个全局变量的指针也可以,但不推荐这么做。)作为函数参数传递给其他流接口函数,当然如不需要使用返回1即可。
2)BOOL XXX_Deinit(DWORD hDeviceContext);
hDeviceContext:XXX_Init的返回指针值。
功能:整个驱动中最后执行。用来停止和卸载设备。由DeactivateDevice触发设备管理器调用一般在关机时自动使用 。成功返回TRUE即可。
3)DWORD XXX_Open(DWORD hDeviceContext, DWORD AccessCode ,DWORD ShareMode);
hDeviceContext:XXX_Init的返回指针值;
AccessCode:访问模式标志,读、写或其他,该值为CreateFile的输入参数;
ShareMode:驱动的共享方式标志该,值为CreateFile的输入参数。
功能:打开设备,为后面的操作初始化数据就够,准备相应的资源。应用程序通过CreateFile函数间接调用。返回一个指针,这个值还作为参数传递给其他接口函数XXX_Read、XXX_Write、XXX_Seek、XXX_IOControl,如果XXX_Init返回的结构体数据需要这几个函数中使用,建议该指针指向的结构体或类是XXX_Init返回的结构体的继承或派生,当然也要使用new来创建同样如不需要使用返回1即可。
4)BOOL XXX_Close(DWORD hOpenContext);
hOpenContext:XXX_Open返回的指针值。
功能:关闭设备,释放资源。由CloseHandle函数关闭驱动时会间接调用该函数。
5)DWORD XXX_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count);
hOpenContext:XXX_Open返回值。
pBuffer:缓冲区指针,接收数据,由ReadFile传入。
Count:缓冲区长度,由ReadFile传入。
功能:由ReadFile函数间接调用,用来读取设备上的数据。返回读取的实际数据字节数。
6)DWORD XXX_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count);
hOpenContext:XXX_Open返回值。
pBuffer:指针指向将写入的数据,由 WriteFile 传入。
Count:写入数据的长度,由 WriteFile 传入。
功能:由WriteFile函数间接调用,把数据写到设备上,返回实际写入的数据数,如返回-1则表示失败。
7)BOOL XXX_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn,DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut);
hOpenContext:XXX_Open返回值。
dwCode:控制命令字,由DeviceIoControl传入。
pBufIn:指向输入缓冲区,由DeviceIoControl传入。
dwLenIn:输入内容的长度,由DeviceIoControl传入。
pBufOut:指向输出缓冲区,由DeviceIoControl传入。
dwLenOut:输出缓冲区长度,由DeviceIoControl传入。
pdwActualOut:实际输出数据长度,由DeviceIoControl传入。
功能:用于向设备发送命令,应用程序通过DeviceIoControl调用来实现该功能。要调用这个接口还需要在应用层和驱动之间建立一套相同的命令,通过宏定义CTL_CODE来实现,当然如果不喜欢用CTL_CODE来实现,也可以用一个常数来实现(其实CTL_CODE宏最终生成的也是一个常数,但更便于理解与维护,所以建议使用CTL_CODE)。
后面的部分请看“WinCE流驱动的各函数的分析整理2”
文章评论(0条评论)
登录后参与讨论