• WINDOWS CE/MOBILE 流驱动编写


    那天在网上还看到有人继承讨论 什么流驱动要实现的函数是不是一定要叫做INIT,OPEN什么的,前辍到底是哪来的,等等,于是干脆就翻出来自己当时入门时的一个程序SHARE一下:)
    其实你要实现的函数可以看下面的注释,前辍吗是在注册表当中写好的,呵呵。应该是"Prefix"="STR",然后你就要实现XXX_INIT.
    以这个最小的驱动为例子,注释在后面了,
    // StringDriver.cpp : Defines the entry point for the DLL application.
    //

    #include "stdafx.h"

    #include <tchar.h>
    #define BUFSIZE 256
    WCHAR achBuffer[BUFSIZE];

    BOOL APIENTRY DllMain( HANDLE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch(ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
            RETAILMSG(1,(TEXT("Strings:DLL_PROCESS_ATTACH/n")));
            return TRUE;
        case DLL_THREAD_ATTACH:
            RETAILMSG(1,(TEXT("Strings:DLL_THREAD_ATTACH/n")));
            break;
        case DLL_THREAD_DETACH:
            RETAILMSG(1,(TEXT("Strings:DLL_THREAD_DETACH/n")));
            break;
        case DLL_PROCESS_DETACH:
            RETAILMSG(1,(TEXT("Strings:DLL_PROCESS_DETACH/n")));
            break;

    #ifdef UNDER_CE
        case DLL_PROCESS_EXITING:
            RETAILMSG(1,(TEXT("Strings:DLL_PROCESS_EXITING/n")));
            break;
        case DLL_SYSTEM_STARTED:
            RETAILMSG(1,(TEXT("Strings:DLL_SYSTEM_STARTED/n")));
            break;
    #endif
        }
        return TRUE;
    }
    //此上的代码没什么大用.
    //导出各符号
    STRINGDRIVERDLL_API DWORD STR_Init(DWORD dwContext);
    STRINGDRIVERDLL_API BOOL STR_Deinit(DWORD hDeviceConext);
    STRINGDRIVERDLL_API DWORD STR_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode);
    STRINGDRIVERDLL_API BOOL STR_Close(DWORD hOpenContext);
    STRINGDRIVERDLL_API BOOL STR_IOControl(DWORD hOpenContext,DWORD swCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);
    STRINGDRIVERDLL_API void STR_PowerDown(DWORD hDeviceContext);
    STRINGDRIVERDLL_API void STR_PowerUp(DWORD hDeviceContext);
    STRINGDRIVERDLL_API DWORD STR_Read(DWORD hOpenContext,LPVOID pBuffer,DWORD Count);
    STRINGDRIVERDLL_API DWORD STR_Seek(DWORD hOpenContext,long Amount,DWORD Type);
    STRINGDRIVERDLL_API DWORD STR_Write(DWORD hOpenContext,LPVOID pSourceBytes,DWORD NumberOfBytes);

    //以下为驱动各个派遣例程函数

    STRINGDRIVERDLL_API DWORD STR_Init(DWORD dwContext)
    {
        DWORD dwRet=0;
        RETAILMSG(1,(TEXT("Strings:STR_Init/n")));

        //初始化驱动程序
        memset(achBuffer,0,BUFSIZE*sizeof(WCHAR));
        //返回一个不为0的数
        dwRet=1;
        return dwRet;
    }

    //---------------------------------------------------------
    STRINGDRIVERDLL_API BOOL STR_Deinit(DWORD hDeviceConext)
    {
       与INIT相对泻载函数       
        BOOL bRet=TRUE;
        RETAILMSG(1,(TEXT("Strings:STR_Deinit/n")));
        return bRet;
    }

    //---------------------------------------------------------
    STRINGDRIVERDLL_API DWORD STR_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode)
    {
        DWORD dwRet=0;
        RETAILMSG(1,(TEXT("Strings:STR_Open/n")));
        //一个要返回一个非空的噢,非常谁调他谁就ACEESS DENY了:)
        dwRet=1;
        return dwRet;
    }

    //---------------------------------------------------------
    STRINGDRIVERDLL_API BOOL STR_Close(DWORD hOpenContext)
    {
        BOOL bRet=TRUE;
    //这个可不是缺载啊,是关闭!
        RETAILMSG(1,(TEXT("Strings:STR_Close/n")));
        return bRet;
    }

    //---------------------------------------------------------
    STRINGDRIVERDLL_API BOOL STR_IOControl(DWORD hOpenContext,DWORD swCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
    {
        BOOL bRet=TRUE;
        RETAILMSG(1,(TEXT("Strings:STR_IOControl/n")));
        return bRet;
    }

    //---------------------------------------------------------
    STRINGDRIVERDLL_API void STR_PowerDown(DWORD hDeviceContext)
    {
        RETAILMSG(1,(TEXT("Strings:STR_PowerDown/n")));
       // 当这个设备断电了,系统会通知   
    }

    //---------------------------------------------------------
    STRINGDRIVERDLL_API void STR_PowerUp(DWORD hDeviceContext)
    {
        RETAILMSG(1,(TEXT("Strings:STR_PowerUp/n")));
    }

    //---------------------------------------------------------
    STRINGDRIVERDLL_API DWORD STR_Read(DWORD hOpenContext,LPVOID pBuffer,DWORD Count)
    {
        DWORD dwRet=0;
        RETAILMSG(1,(TEXT("Strings:STR_Read/n")));
        //确定实际要读取的字节的大小并读取数据
        DWORD cbBuffer=wcslen(achBuffer);
        dwRet=min(cbBuffer,Count);
        wcsncpy((LPWSTR)pBuffer,achBuffer,dwRet);
        //返回实际读取的字节数
        return dwRet;
    }

    //---------------------------------------------------------
    STRINGDRIVERDLL_API DWORD STR_Seek(DWORD hOpenContext,long Amount,DWORD Type)
    {
        DWORD dwRet=0;
        RETAILMSG(1,(TEXT("Strings:STR_Seek/n")));
        return dwRet;
    }

    //---------------------------------------------------------
    STRINGDRIVERDLL_API DWORD STR_Write(DWORD hOpenContext,LPVOID pSourceBytes,DWORD NumberOfBytes)
    {
        DWORD dw
    Ret=0;
        RETAILMSG(1,(TEXT("Strings:STR_Write/n")));

        //确定实际要写入字节的大小,写入数据
        dwRet=min(BUFSIZE,NumberOfBytes);
        wcsncpy(achBuffer,(LPWSTR)pSourceBytes,dwRet);

        //返回实际写入的字节数
        return dwRet;
    }

  • 相关阅读:
    servlet遇到的问题
    servlel出现404问题★ 出现不自动映射 设置XML的问题时候
    c3p0的错误mchange.v2.ser.Indirector
    【转】JSON和JSONP
    性能测试理论
    如何解决包冲突问题
    一方包、二方包、三方包是什么?
    利用selenium webdriver点击alert提示框
    采用Spring管理Bean和依赖注入
    Java加载jar文件并调用jar文件当中有参数和返回值的方法
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2458400.html
Copyright © 2020-2023  润新知