|
请教老师们:自已写的winCE驱动程序被加载后,马上又被卸载了?
[复制链接]
我在Platform Builder下编写了一个很简单的LED驱动程序,就包含了DllMain,LED_Init,LED_Open,LED_DeInit,LED_close,LED_Powerup,LED_Powerdown等等函数的操作。然后在release目录下的Platform.reg的\drivers\builtIn当中添加了该驱动程序。启动WINCE后,在终端调试窗口提示
"LedDrv - DLL_PROCESS_ATTACH"-------被加载
"LedDrv - DLL_PROCESS_DETACH"-------被卸载
........
"LedDrv - DLL_PROCESS_ATTACH"-------被加载
"LedDrv - DLL_PROCESS_DETACH"-------被卸载
而且反复好几次.这是为什么啊?为什么被加载后,立马又被卸载了?
我的代码如下:
///LedDrv.cpp
#include "stdafx.h"
#include
#include
#include
#pragma comment(lib,"ceddk.lib")
volatile IOPreg *v_pIOPRegs;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
OutputDebugString(L"LedDrv - DLL_PROCESS_ATTACH\n");
break;
case DLL_PROCESS_DETACH:
OutputDebugString(L"LedDrv - DLL_PROCESS_DETACH\n");
break;
case DLL_THREAD_ATTACH:
OutputDebugString(L"LedDrv - DLL_THREAD_ATTACH\n");
break;
case DLL_THREAD_DETACH:
OutputDebugString(L"LedDrv - DLL_THREAD_DETACH\n");
break;
default:
break;
}
return TRUE;
}
/**********************LED_Init******************************/
DWORD LED_Init( LPCTSTR pContext, LPCVOID lpvBusContext)
{
RETAILMSG(1, (TEXT("***************LED_Init******************\n")));
v_pIOPRegs = (volatile IOPreg*)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);//申请
if(v_pIOPRegs)
{
if (VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE)) //映射
{
RETAILMSG (1,(TEXT("v_pIOPRegs is mapped to %x\n\r"), v_pIOPRegs));
OutputDebugString(L"v_pIOPRegs is mapped\n");
return 7;//不返回0
}
else
{
RETAILMSG (1,(TEXT("v_pIOPRegs is not mapped\n\r")));
OutputDebugString(L"v_pIOPRegs is not mapped\n");
return -1;
}
}
else
{
RETAILMSG (1,(TEXT("v_pIOPRegs is not allocated\n\r")));
OutputDebugString(L"v_pIOPRegs is not allocated\n");
return -2;
}
}
/***********************************LED_Deinit***********************/
BOOL LED_Deinit( DWORD hDeviceContext )
{
RETAILMSG(1, (TEXT("*****************LED_Deinit*****************\n")));
return TRUE;
}
/******************************LED_Open******************************/
DWORD LED_Open( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode )
{
RETAILMSG(1, (TEXT("******************LED_Open*********************\n")));
return 1;
}
/******************************LED_Close******************************/
BOOL LED_Close( DWORD hOpenContext )
{
RETAILMSG(1, (TEXT("*****************LED_Close*********************\n")));
return TRUE;
}
/******************************LED_Read******************************/
DWORD LED_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count )
{
RETAILMSG(1, (TEXT("*********************LED_Read********************\n")));
return 0;
}
/******************************LED_Write******************************/
DWORD LED_Write( DWORD hOpenContext, LPCVOID pBuffer, DWORD Count )//Beep!!!!!
{
BYTE Butter_Temp;
RETAILMSG(1, (TEXT("******************LED_Write*******************\n")));
// 获取应用程序地址空间数据指针
pWriteBuffer = MapPtrToProcess((LPVOID)pBuffer, GetCallerProcess());
Butter_Temp=*pWriteBuffer;
//Beep!!!!!
v_pIOPRegs->rGPBCON |= (1<<0);
v_pIOPRegs->rGPBCON &= (0<<1);//GPB10 OutPut
v_pIOPRegs->rGPBDAT |= (1<<10);//GPB10 =1
return 1;
}
////sources
WINCEREL=1
RELEASETYPE=PLATFORM
_ISVINCPATH=$(_WINCEROOT)\public\common\sdk\inc;
_OEMINCPATH=$(_WINCEROOT)\public\common\oak\inc;$(_WINCEROOT)\public\common\sdk\inc;
TARGETNAME=LedDrv
FILE_VIEW_ROOT_FOLDER= \
ReadMe.txt \
StdAfx.cpp \
prelink.bat \
postlink.bat \
FILE_VIEW_RESOURCE_FOLDER= \
FILE_VIEW_INCLUDES_FOLDER= \
StdAfx.h \
INCLUDES= \
$(_WINCEROOT)\PUBLIC\COMMON\DDK\INC;$(_WINCEROOT)\PUBLIC\COMMON\OAK\INC; \
SOURCES= \
LedDrv.cpp \
TARGETTYPE=DYNLINK
PRECOMPILED_CXX=1
PRECOMPILED_PCH=StdAfx.pch
TARGETLIBS= \
//Platform.reg
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\LedDrv]
"Index"=dword:0
"prefix"="LED"
"Dll"="LedDrv.dll"
"Order"=dword:0
//Platform.bib
LedDrv.dll $(_FLATRELEASEDIR)\LedDrv.dll NK SH
|
|