|
引用 14 楼 CBEMA 的回复:
这只是一个思路,不知道实现起来是否可行:
1. 申请一块内存。此内存最好是在中断服务中申请,也就是只有内核可以访问。而且地址固定在一个其他程序不会访问到的地方。初始化为0。
2. 中断服务执行时,第一条语句检测此内存是否为1(代表应用正在使用),为1则直接退出,为0(应用没用使用),继续执行。
3. 在应用中通过内存影射方式,访问此地址内存中的数据,为0,就设为1,然后等待几毫秒,重新访问此内存,为1,就执行应用操作。
4. 操作完成之后,一定要将此内存还原为0,否则中断服务程序永远无法得到执行。
这种方法比较危险,因为在应用中操作内核区域的内存始终不是明智之举。
参考CBEMA的思路,大家看看我这样的方法可以不
内核态的中断处理DLL中编写函数Write8530Reg、Read8530Reg,
- Write8530Reg(PAM8530_Virt pVirt, DWORD reg_index, DWORD value)
- {
- while(pVirt->RegOperating); //等待操作完成,ISR中调用此函数也会等待,但考虑到此位马上会被清零(用户态代码马上会结束操作),
- //也让ISR等待,不知道可不可以
- pVirt->RegOperating = TRUE; //置位正在操作位
- ...
- //寄存器操作
- ...
- pVirt->RegOperating = FALSE; //清正在操作位
- }
复制代码
其中PAM8530_Virt结构体中有
- typedef tag_am8530_virt
- {
- //一些驱动相关的成员
- BOOL RegOperating; //表示寄存器是否正在操作中
- }
复制代码
然后写IOContrl函数
- BOOL
- IOControl(
- DWORD InstanceIndex,
- DWORD IoControlCode,
- LPVOID pInBuf,
- DWORD InBufSize,
- LPVOID pOutBuf,
- DWORD OutBufSize,
- LPDWORD pBytesReturned
- )
- {
- ...
- case IOCTL_ISR8530_WRITE_REG: //写寄存器操作
- Write8530Reg(...);
- ...
- }
复制代码
然后用户通过调用KernelLibIoControl用IOCTL_ISR8530_WRITE_REG操作码读写寄存器,
ISR直接用Write8530Reg操作寄存器
这样看有没有什么问题 |
|