关于动态加载中断流驱动,该如何解决

关于动态加载中断流驱动
1:如果加载驱动不成功 首先注意你的XXX_Open() 那3个XXX是否大写
2:对于WINCE4.2以上的版本,动态加载中断流是不成功的啊

但是我的版本是WINCE5.0,而且我大小写都注意了,我就是用CE驱动调试助手激活我的中断驱动就是不成功啊

希望大侠们指点
放出我的程序
[code=C/C++][/code]



/*******************************************************************
** 函数: DLL程序入口
** 功能: 驱动形式是DLL的
********************************************************************/
BOOL WINAPI DllEntry(HANDLE hinstDLL,
DWORD dwReason,
LPVOID /* lpvReserved */)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}

return TRUE;
}

BOOL KEY_Deinit(DWORD hDeviceContext)
{
BOOL ret=true;

RETAILMSG(1,(TEXT("WZQ_KEY:KEY_Deinit......\r\n")));

//屏蔽系统逻辑按键中断
InterruptDisable(SYSINTR_USER_KEY);

CloseHandle(g_hEINTIntrThread);

for(int i=0; i<4; i++)
{
CloseHandle(g_ahKeyEvent[i]);
}
//释放虚拟内存空间
VirtualFree((void*)s2440IOP, sizeof(IOPreg), MEM_RELEASE);
VirtualFree((void*)s2440INT, sizeof(INTreg), MEM_RELEASE);

return TRUE;
}

BOOL KeyGpioInit()
{
RETAILMSG(1,(TEXT("Key_Gpio_Setting----\r\n")));
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x0)) | (0x2 << 0x0); // GPG0 == EINT8
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 0)) | (0x3 << 0); // Falling-edge triggered.

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x6)) | (0x2 << 0x6); // GPG3 == EINT11
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 12)) | (0x3 << 12); // Falling-edge triggered.

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x10)) | (0x2 << 0x10); // GPG5 == EINT13
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 20)) | (0x3 << 20); // Falling-edge triggered.

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x12)) | (0x2 << 0x12); // GPG6 == EINT14
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 24)) | (0x3 << 24); // Falling-edge triggered.

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x14)) | (0x2 << 0x14); // GPG7 == EINT15
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 28)) | (0x3 << 28); // Falling-edge triggered.

s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x22)) | (0x2 << 0x22); // GPG11 == EINT19
s2440IOP->rEXTINT2 = (s2440IOP->rEXTINT2 & ~(0x7<< 12)) | (0x3 << 12); // Falling-edge triggered.
return TRUE;
}

BOOL InitInterruptThread(void)
{
DWORD threadID;
DWORD ret; 

g_hKeyEvent=CreateEvent(NULL, FALSE, FALSE, NULL);

if(!g_hKeyEvent)
{
RETAILMSG(1,(TEXT("Fail to g_hKeyEvent=CreateEvent(NULL, FALSE, FALSE, NULL);\r\n")));
return FALSE;
}

ret=InterruptInitialize(SYSINTR_USER_KEY, g_hKeyEvent, NULL, 0);

if(!ret)
{
RETAILMSG(1,(TEXT("Fail to ret=InterruptInitialize(SYSINTR_USER_KEY, g_hKeyEvent, NULL, 0);\r\n")));
return FALSE;
}

g_hEINTIntrThread=CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE)EintThread,
0,
0,
&threadID
);
if(NULL == g_hEINTIntrThread)
{
RETAILMSG(1,(TEXT("Fail to g_hEINTIntrThread\r\n")));
return FALSE;
}

RETAILMSG(1,(_T("UserKey.DLL::InterruptThread Initialized.\r\n")));