VS2005 WINCE 简单的 流驱动 模板 转载

一个简单的WinCE流驱动模板

驱动程序部分

#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <tchar.h>
 
HANDLE g_hInstance;
 
#define BUFSIZE 256
WCHAR achBuffer[BUFSIZE];
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
BOOL WINAPI  
DllEntryPoint(HANDLE hinstDLL, 
              DWORD dwReason, 
              LPVOID  lpvReserved )
{
    switch(dwReason)
    {
    case DLL_PROCESS_ATTACH:
        g_hInstance = hinstDLL;
        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;
}
 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
BOOL STR_Close(DWORD hOpenContext)
{
    BOOL bRet = TRUE;
    RETAILMSG(1,(TEXT("STRINGS: STR_Close/n")));
    return bRet;
} 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
BOOL STR_Deinit(DWORD hDeviceContext)
{
    BOOL bRet = TRUE;
    RETAILMSG(1,(TEXT("STRINGS: STR_Deinit/n")));
    return bRet;
} 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
DWORD STR_Init(DWORD dwContext)
{
    DWORD dwRet = 0;
    RETAILMSG(1,(TEXT("STRINGS: STR_Init/n")));
 
    // Initialize buffer to zero.
    memset (achBuffer, 0, BUFSIZE * sizeof(WCHAR));
 
    // Set return value to non-zero.
    dwRet = 1;
    return dwRet;
} 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
BOOL STR_IOControl(DWORD hOpenContext, 
                   DWORD dwCode, 
                   PBYTE pBufIn, 
                   DWORD dwLenIn, 
                   PBYTE pBufOut, 
                   DWORD dwLenOut, 
                   PDWORD pdwActualOut)
{
    BOOL bRet = TRUE;
    RETAILMSG(1,(TEXT("STRINGS: STR_IOControl/n")));
    return bRet;
}
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
DWORD STR_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
    DWORD dwRet = 0;
    RETAILMSG(1,(TEXT("STRINGS: STR_Open/n")));
 
    dwRet = 1; // Have to make non-zero for this call to succeed.
    return dwRet;
} 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
void STR_PowerDown(DWORD hDeviceContext)
{
    RETAILMSG(1,(TEXT("STRINGS: STR_PowerDown/n")));
} 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
void STR_PowerUp(DWORD hDeviceContext)
{
    RETAILMSG(1,(TEXT("STRINGS: STR_PowerUp/n")));
} 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
DWORD STR_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
    DWORD dwRet = 0;
    RETAILMSG(1,(TEXT("STRINGS: STR_Read/n")));
 
    // Copy the smaller of buffer size or string size.
    DWORD cbBuffer = wcslen(achBuffer);
    dwRet = min(cbBuffer, Count);
    wcsncpy((LPWSTR)pBuffer, achBuffer, dwRet);
 
    // Return number of bytes read.
    return dwRet;
} 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
DWORD STR_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
    DWORD dwRet = 0;
    RETAILMSG(1,(TEXT("STRINGS: STR_Seek/n")));
    return dwRet;
} 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
DWORD STR_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
    DWORD dwRet = 0;
    RETAILMSG(1,(TEXT("STRINGS: STR_Write/n")));
 
    // Copy the smaller of buffer size or number of bytes they send us.
    dwRet = min(BUFSIZE, NumberOfBytes);
    wcsncpy(achBuffer, (LPWSTR)pSourceBytes, dwRet);
 
    // Return number of bytes written.
    return dwRet;
}

驱动程序注册表部分

[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/STRINGS]
   "Index"=dword:1
   "Prefix"="STR"
   "Dll"="String.dll"
   "Order"=dword:0

调用这个驱动程序

#include <windows.h>
#include "StdAfx.h"
 
#define BUFFER_SIZE  256  // The buffer size is the same as the driver's buffer size
 
 
int WINAPI WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR     lpCmdLine,
                     int       nCmdShow)
{
 
 // Open the STRINGS driver with READ and WRITE access
 
 // ---------------------------------------------------------------------
 
    HANDLE hStr = CreateFile(TEXT("STR1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
    if (INVALID_HANDLE_VALUE == hStr)
    {
        MessageBox(NULL, _T("Cannot open STR1:"), _T("StringApp"), MB_OK);
        return 0;
    }
 
    // Write a string to the driver.
 
 // ---------------------------------------------------------------------
 
    DWORD  dwWritten = 0;
    WCHAR* pString   = TEXT("This is a test of the String Driver. This is o­nly a test");
    WriteFile(hStr, pString, (_tcslen(pString)+1), &dwWritten, NULL);
 
    // Read string from driver.
 
 // ---------------------------------------------------------------------
 
    WCHAR wch[BUFFER_SIZE];
    DWORD dwBytesRead = BUFFER_SIZE;
    memset(&wch, '/0', BUFFER_SIZE * sizeof(WCHAR));
 
    ReadFile(hStr, wch, sizeof(wch), &dwBytesRead, NULL);
 
    MessageBox(NULL, wch, TEXT("StringApp"), MB_OK);
 
    // Disconnect from driver.
 // ---------------------------------------------------------------------
 
    CloseHandle(hStr);
 
 return 0;
}

你可能感兴趣的:(VS2005 WINCE 简单的 流驱动 模板 转载)