串口伪驱动实例

//========================================================================
//TITLE:
//    串口伪驱动实例
//AUTHOR:
//    norains
//DATE:
//   Monday  23-April-2007
//Environment:
//        EVC4.0 + Standard SDK 4.2
//        EVC4.0 + Standard SDK 5.0
//========================================================================

    所谓的伪驱动,就是不是真正意义上的驱动;而挂着驱动的名号,却又是因为和底层驱动有着千丝万缕的联系.
   
    在此之前,先让我们看看wince的驱动结构:(图1)

   
    而我们的伪驱动是挂接在PDD层之上,MDD层之下,形成一个"通道":(图2)

   
    伪驱动的实现其实很简单,对外实现MDD层的借口,而其内则是通过调用原串口驱动实现其功能.
   
    现在以夏普LH7A404平台为基础编写串口伪驱动,代码如下:

// --------------------------------------------------------------------
// Macro define

// For SHARP LH404
#define  COM_DLL_PATH    TEXT("/WINDOWS/OEMserial.dll") 

// -------------------------------------------------------------------
// Function define
typedef HANDLE (WINAPI  * DLL_COM_INIT)(ULONG Identifie);
typedef BOOL (WINAPI 
* DLL_COM_DEINIT)( void );
typedef HANDLE (WINAPI 
* DLL_COM_OPEN)(HANDLE pContext,DWORD AccessCode,DWORD ShareMode);
typedef BOOL (WINAPI 
* DLL_COM_CLOSE)(DWORD pContext);
typedef ULONG (WINAPI 
* DLL_COM_READ)(HANDLE pContext,PUCHAR pTargetBuffer,ULONG BufferLength,PULONG pBytesRead);
typedef ULONG (WINAPI 
* DLL_COM_WRITE)(HANDLE COM_Write,PUCHAR pSourceBytes,ULONG NumberOfBytes);
typedef BOOL (WINAPI 
* DLL_COM_POWERDOWN)(HANDLE pContext);
typedef BOOL (WINAPI 
* DLL_COM_POWERUP)(HANDLE pContext);
typedef BOOL (WINAPI 
* DLL_COM_IOCONTROL)(DWORD dwOpenData,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);
typedef DWORD (WINAPI 
* DLL_COM_SEEK)(DWORD hOpenContext, long  Amount,WORD Type);


DLL_COM_INIT        COM_INIT;
DLL_COM_DEINIT        COM_DEINIT;
DLL_COM_OPEN        COM_OPEN;
DLL_COM_CLOSE        COM_CLOSE;
DLL_COM_READ        COM_READ;
DLL_COM_WRITE        COM_WRITE;
DLL_COM_SEEK        COM_SEEK;
DLL_COM_POWERDOWN    COM_POWERDOWN;
DLL_COM_POWERUP        COM_POWERUP;
DLL_COM_IOCONTROL    COM_IOCONTROL;
// -------------------------------------------------------------------
BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{

    HINSTANCE hInstComDll 
= LoadLibrary(COM_DLL_PATH);
    
if(hInstComDll != NULL)
    
{
        COM_INIT 
= (DLL_COM_INIT) GetProcAddress(hInstComDll,TEXT("COM_Init"));
        COM_DEINIT 
= (DLL_COM_DEINIT) GetProcAddress(hInstComDll,TEXT("COM_Deinit"));
        COM_OPEN 
= (DLL_COM_OPEN) GetProcAddress(hInstComDll,TEXT("COM_Open"));
        COM_CLOSE 
= (DLL_COM_CLOSE) GetProcAddress(hInstComDll,TEXT("COM_Close"));
        COM_READ 
= (DLL_COM_READ) GetProcAddress(hInstComDll,TEXT("COM_Read"));
        COM_WRITE 
= (DLL_COM_WRITE) GetProcAddress(hInstComDll,TEXT("COM_Write"));
        COM_POWERDOWN 
= (DLL_COM_POWERDOWN) GetProcAddress(hInstComDll,TEXT("COM_PowerDown"));
        COM_POWERUP 
= (DLL_COM_POWERUP) GetProcAddress(hInstComDll,TEXT("COM_PowerUp"));
        COM_IOCONTROL 
= (DLL_COM_IOCONTROL) GetProcAddress(hInstComDll,TEXT("COM_IOControl"));
        COM_SEEK 
= (DLL_COM_SEEK) GetProcAddress(hInstComDll,TEXT("COM_Seek"));
    }

    
else
    
{
        WRITELOG(
"DllMain() hInstComDll is NULL");
        
return FALSE;
    }



    
if(COM_INIT == NULL ||
        COM_DEINIT 
== NULL ||
        COM_OPEN 
== NULL ||
        COM_CLOSE 
== NULL ||
        COM_READ 
== NULL ||
        COM_WRITE 
== NULL ||
        COM_SEEK 
== NULL ||
        COM_POWERDOWN 
== NULL ||
        COM_POWERUP 
== NULL ||
        COM_IOCONTROL 
== NULL)
    
{

        WRITELOG(
"Function of DllMain()  is NULL");
        
return FALSE;
    }




    
return TRUE;
}




HANDLE COM_Init(ULONG Identifier)
{
    
return COM_INIT(Identifier);
}



BOOL COM_Deinit(
void )
{
    
return COM_DEINIT();
}



HANDLE COM_Open(HANDLE pContext,DWORD AccessCode,DWORD ShareMode)
{

    
return COM_OPEN(pContext,AccessCode,ShareMode);
}



BOOL COM_Close(DWORD pContext)
{

    
return COM_CLOSE(pContext);
}



ULONG COM_Read(HANDLE pContext,PUCHAR pTargetBuffer,ULONG BufferLength)
{
    
return COM_READ(pContext,pTargetBuffer,BufferLengthd);
}



ULONG COM_Write(HANDLE COM_Write,PUCHAR pSourceBytes,ULONG NumberOfBytes)
{
    
return COM_WRITE(COM_Write,pSourceBytes,NumberOfBytes);
}


DWORD COM_Seek(DWORD hOpenContext,
long  Amount,WORD Type)
{
    
return COM_SEEK(hOpenContext,Amount,Type);
}



BOOL COM_PowerDown(HANDLE pContext)
{
    
return COM_POWERDOWN(pContext);
}



BOOL COM_PowerUp(HANDLE pContext)
{
    
return COM_POWERUP(pContext);
}



BOOL COM_IOControl(DWORD dwOpenData,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
{
    
return COM_IOCONTROL(dwOpenData,dwCode,pBufIn,dwLenIn,pBufOut,dwLenOut,pdwActualOut);
}



    "OEMserial.dll"是原来LH404的驱动,我们这个伪驱动仅仅是在代码中调用该动态链接库实现该实现的功能而已.
   
    如果需要让我们的伪驱动正常运作,在将伪驱动包含进系统之后,还需要更改相关的注册表----将位于[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/series]的"DLL"键值改为我们伪驱动的名字即可.
   
    这伪驱动有什么现实上的意义呢?对于应用层的话,也许不会起到任何作用;但如果是用作分析数据或破解算法的话,有时候确实一个挺方便的方法,毕竟调用驱动的任何数据都会经过我们的这个伪驱动,还有什么不能做的呢?
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值