zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    git rebase 还是 merge的使用场景最通俗的解释
    漏洞复现:Struts2 远程代码执行漏洞(S2-033)
    linux临时网络配置
    漏洞复现:Struts2 S2-032 漏洞环境
    XXE攻击学习
    启用了不安全的HTTP方法【转】
    HTTP参数污染【转】
    逻辑漏洞挖掘方式
    大漏洞时代下的僵尸网络追踪-笔记
    markdown入门杂记
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2458400.html
Copyright © 2011-2022 走看看