亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lpt.c

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++

THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:
    lpt.c

Abstract:
   LPT_Xxx Streams interface for USB Print Client Driver.

Functions:

Notes:

--*/


#include "usbprn.h"


const TCHAR g_sPortsKey[] = TEXT("Printers\\Ports");


BOOL
RegisterLPTName(
   LPTSTR ActivePath,
   LPTSTR PortName
   );

BOOL
DeregisterLPTName(
   LPTSTR PortName
   );

BOOL
RegisterPrinterSettings(
   PUSBPRN_CONTEXT pUsbPrn
   );

BOOL
DeregisterPrinterSettings(
   PUSBPRN_CONTEXT pUsbPrn
   );

PUSBPRN_CONTEXT
GetContextFromReg(
   LPTSTR  ActivePath
   );

DWORD
LPT_ReadComplete(
   PVOID    Context
   );

DWORD
LPT_WriteComplete(
   PVOID    Context
   );


/*++
Called by Device Manager to initialize the streams interface in response to ActivateDevice.
We passed ActivateDevice a pointer to our device context, but must read it out of the registry as "ClientInfo".

Returns context used in XXX_Open, XXX_PowerDown, XXX_PowerUp, and XXX_Deinit
--*/
PUSBPRN_CONTEXT
LPT_Init(
   PVOID Context
   )
{
   LPTSTR ActivePath = (LPTSTR)Context; // HKLM\Drivers\Active\xx
   PUSBPRN_CONTEXT pUsbPrn = NULL;
   BOOL bRc = FALSE;

   DEBUGMSG(ZONE_LPT_INIT, (TEXT(">LPT_Init(%p)\n"), Context));

   //
   // get our Context
   //
   pUsbPrn = GetContextFromReg( ActivePath );

   //
   // Register our file device (LPT) name
   //
   if ( VALID_CONTEXT( pUsbPrn ) ) {

      EnterCriticalSection(&pUsbPrn->Lock);

      do {

         if ( pUsbPrn->ActivePath ) {
            DEBUGMSG(ZONE_ERR, (TEXT("Existing ActivePath: %s\n"), pUsbPrn->ActivePath));
            TEST_TRAP();
            break;
         }

         pUsbPrn->ActivePath = ActivePath;

         memset( pUsbPrn->PortName, 0, sizeof(pUsbPrn->PortName));

         bRc = RegisterLPTName( ActivePath,
                                pUsbPrn->PortName );
         if ( !bRc ) {
            DEBUGMSG(ZONE_ERR, (TEXT("RegisterLPTName Failed\n")));
            break;
         }

         bRc = RegisterPrinterSettings( pUsbPrn );

         if ( !bRc ) {
            DEBUGMSG(ZONE_ERR, (TEXT("RegisterPrinterSettings Failed\n")));
            break;
         }

      } while (0);

      LeaveCriticalSection(&pUsbPrn->Lock);
   }

   DEBUGMSG(ZONE_LPT_INIT, (TEXT("<LPT_Init:0x%x\n"), pUsbPrn ));

   return (bRc ? pUsbPrn : NULL);
}


BOOL
LPT_Deinit(
   PUSBPRN_CONTEXT pUsbPrn
   )
{
   BOOL  bRc = FALSE;

   DEBUGMSG(ZONE_LPT_INIT, (TEXT(">LPT_Deinit\n")));

   if ( VALID_CONTEXT( pUsbPrn ) ) {

      EnterCriticalSection( &pUsbPrn->Lock );

#if DEBUG
      if (pUsbPrn->Flags.Open) {
         DEBUGMSG(ZONE_ERR, (TEXT("LPT_Deinit on Open Device!\n")));
         TEST_TRAP();
      }
#endif

      bRc = DeregisterLPTName( pUsbPrn->PortName );
      if ( !bRc ) {
         DEBUGMSG(ZONE_ERR, (TEXT("DeregisterLPTName Failed\n")));
      }

      memset( pUsbPrn->PortName, 0, sizeof(pUsbPrn->PortName));

      bRc = DeregisterPrinterSettings( pUsbPrn );
      if ( !bRc ) {
         DEBUGMSG(ZONE_ERR, (TEXT("DeregisterPrinterSettings Failed\n")));
      }

      LeaveCriticalSection(&pUsbPrn->Lock);

   }

   DEBUGMSG(ZONE_LPT_INIT, (TEXT("<LPT_Deinit:%d\n"), bRc));

   return bRc;
}


//
// Returns open context to be used in the
// XXX_Read, XXX_Write, XXX_Seek, and XXX_IOControl functions.
// If the device cannot be opened, this function returns NULL.
//
PUSBPRN_CONTEXT
LPT_Open(
   PUSBPRN_CONTEXT Context,      // context returned by LPT_Init.
   DWORD           AccessCode,   // @parm access code
   DWORD           ShareMode     // @parm share mode
   )
{
   PUSBPRN_CONTEXT pUsbPrn = Context;
   BOOL bRc = TRUE;

   UNREFERENCED_PARAMETER(ShareMode);
   UNREFERENCED_PARAMETER(AccessCode);

   DEBUGMSG(ZONE_LPT_INIT,(TEXT(">LPT_Open(0x%x, 0x%x, 0x%x)\n"),pUsbPrn, AccessCode, ShareMode));

   if ( VALID_CONTEXT( pUsbPrn ) ) {

      EnterCriticalSection(&pUsbPrn->Lock);

        if ( !pUsbPrn->Flags.Open &&
           !pUsbPrn->Flags.UnloadPending ) {

            pUsbPrn->Flags.Open = TRUE;

         ResetEvent( pUsbPrn->hCloseEvent ); // non-signaled

        } else {
            DEBUGMSG( ZONE_ERR,(TEXT("LPT_Open: ERROR_ACCESS_DENIED\n")));
            SetLastError(ERROR_ACCESS_DENIED);
            bRc = FALSE;
        }

      LeaveCriticalSection(&pUsbPrn->Lock);

   } else {
      DEBUGMSG( ZONE_ERR,(TEXT("LPT_Open: ERROR_FILE_NOT_FOUND\n")));
        SetLastError(ERROR_FILE_NOT_FOUND);
      bRc = FALSE;
    }

   DEBUGMSG(ZONE_LPT_INIT,(TEXT("<LPT_Open:%d\n"), bRc ));

   return (bRc ? pUsbPrn : NULL);
}


BOOL
LPT_Close(
   PUSBPRN_CONTEXT Context
   )
{
   PUSBPRN_CONTEXT pUsbPrn = Context;

   DEBUGMSG(ZONE_LPT_INIT,(TEXT("LPT_Close(0x%x)\n"),pUsbPrn));

   if ( VALID_CONTEXT( pUsbPrn ) ) {

      EnterCriticalSection(&pUsbPrn->Lock);

      pUsbPrn->Flags.Open = FALSE;

      LeaveCriticalSection(&pUsbPrn->Lock);

      //
      // Note: any waiters are run as soon as we signal this event
      //
      return SetEvent( pUsbPrn->hCloseEvent );

   } else {
      DEBUGMSG( ZONE_ERR,(TEXT("LPT_Close: ERROR_INVALID_HANDLE\n")));
        SetLastError(ERROR_INVALID_HANDLE);
      return FALSE;
   }
}

#define MAX_USBTRANSFER_SIZE 0x1000 // 4k
//
// Printers are sequential byte processing devices,
// so no need for anything fancy
//
ULONG
LPT_Write(
   PUSBPRN_CONTEXT pUsbPrn,
   PUCHAR pBuffer,
   ULONG  BufferLength
   )
{
   DWORD dwTimeout;
   DWORD dwTransferSize;
   DWORD dwBytesTransferred ;
   DWORD dwTatalTransferred = 0 ;
   DWORD dwErr = ERROR_SUCCESS;
   DWORD dwUsbErr = USB_NO_ERROR;

   DEBUGMSG(ZONE_LPT_WRITE,(TEXT(">LPT_Write(0x%x, %d)\n"),pBuffer, BufferLength));

   if ( ACCEPT_IO( pUsbPrn ) ) {

      while  ( pBuffer && BufferLength) {

         dwTransferSize=min(BufferLength,MAX_USBTRANSFER_SIZE);
         dwTimeout = dwTransferSize * pUsbPrn->Timeouts.WriteTotalTimeoutMultiplier +
                     pUsbPrn->Timeouts.WriteTotalTimeoutConstant;

         if (!dwTimeout) {
            dwTimeout = INFINITE;
         }

         DEBUGMSG(ZONE_LPT_WRITE, (TEXT("LPT_Write timeout due in %d msec\n"), dwTimeout));
         EnterCriticalSection( &pUsbPrn->Lock );
         dwBytesTransferred = 0 ;
         dwErr = IssueBulkTransfer( pUsbPrn->UsbFuncs,
                                    pUsbPrn->BulkOut.hPipe,
                                    DefaultTransferComplete,  // Callback
                                    pUsbPrn->BulkOut.hEvent,  // Context
                                    (USB_OUT_TRANSFER /*| USB_SHORT_TRANSFER_OK*/), // Flags
                                    pBuffer, 0,
                                    dwTransferSize,
                                   &dwBytesTransferred,
                                    dwTimeout,
                                   &dwUsbErr );

         if ( ERROR_SUCCESS != dwErr || USB_NO_ERROR != dwUsbErr) {
            DEBUGMSG( ZONE_ERR, (TEXT("IssueBulkTransfer error:%d, 0x%x\n"), dwErr, dwUsbErr));
            IoErrorHandler( pUsbPrn, pUsbPrn->BulkOut.hPipe, pUsbPrn->BulkOut.bIndex, dwUsbErr);
            LeaveCriticalSection( &pUsbPrn->Lock );
            break;
         }
         else {
            LeaveCriticalSection( &pUsbPrn->Lock );
            pBuffer +=dwTransferSize;
            BufferLength -=dwTransferSize;
            dwTatalTransferred +=dwTransferSize;
         }

      };
   } else {
      DEBUGMSG( ZONE_ERR,(TEXT("LPT_Write: ERROR_INVALID_HANDLE\n")));
      dwTatalTransferred=(DWORD)-1;
      SetLastError(ERROR_INVALID_HANDLE);
    }

   DEBUGMSG(ZONE_LPT_WRITE,(TEXT("<LPT_Write:%d\n"), dwTatalTransferred ));

   return dwTatalTransferred;
}


ULONG
LPT_Read(
   PUSBPRN_CONTEXT pUsbPrn,
   PUCHAR pBuffer,
   ULONG  BufferLength
   )
{
   DWORD dwTimeout;
   DWORD dwBytesTransferred = 0;
   DWORD dwErr = ERROR_SUCCESS;
   DWORD dwUsbErr = USB_NO_ERROR;

   DEBUGMSG(ZONE_LPT_READ,(TEXT(">LPT_Read(0x%x, %d)\n"),pBuffer, BufferLength));

   if ( ACCEPT_IO( pUsbPrn ) ) {

      if ( pBuffer && BufferLength ) {

         EnterCriticalSection( &pUsbPrn->Lock );

         dwTimeout = BufferLength * pUsbPrn->Timeouts.ReadTotalTimeoutMultiplier +
                     pUsbPrn->Timeouts.ReadTotalTimeoutConstant;

         if (!dwTimeout) {
            dwTimeout = INFINITE;
         }

         DEBUGMSG(ZONE_LPT_READ, (TEXT("LPT_Read timeout due in %d msec\n"), dwTimeout));

         dwErr = IssueBulkTransfer( pUsbPrn->UsbFuncs,
                                    pUsbPrn->BulkIn.hPipe,
                                    DefaultTransferComplete,    // Callback
                                    pUsbPrn->BulkIn.hEvent,     // Context
                                    (USB_IN_TRANSFER | USB_SHORT_TRANSFER_OK), // Flags
                                    pBuffer, 0,
                                    BufferLength,
                                   &dwBytesTransferred,
                                    dwTimeout,
                                   &dwUsbErr );

         if ( ERROR_SUCCESS != dwErr || USB_NO_ERROR != dwUsbErr) {
            DEBUGMSG( ZONE_ERR, (TEXT("IssueBulkTransfer error:%d, 0x%x\n"), dwErr, dwUsbErr));
            IoErrorHandler( pUsbPrn, pUsbPrn->BulkOut.hPipe, pUsbPrn->BulkOut.bIndex, dwUsbErr);
         }

         LeaveCriticalSection( &pUsbPrn->Lock );

      } else {
         DEBUGMSG( ZONE_ERR,(TEXT("LPT_Read: ERROR_INVALID_PARAMETER\n")));
           SetLastError(ERROR_INVALID_PARAMETER );
       }


   } else {
      DEBUGMSG( ZONE_ERR,(TEXT("LPT_Read: ERROR_INVALID_HANDLE\n")));
        SetLastError(ERROR_INVALID_HANDLE);
    }

   DEBUGMSG(ZONE_LPT_READ,(TEXT("<LPT_Read:%d\n"), dwBytesTransferred));

   return dwBytesTransferred;
}



BOOL
LPT_IOControl(

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区国语对白| 午夜不卡av免费| 国产精品影音先锋| 精品国产一区二区国模嫣然| 日韩二区三区在线观看| 欧美日韩一区二区不卡| 一区二区三区精品视频| 91亚洲精品久久久蜜桃网站| 国产精品理伦片| 成人精品视频一区二区三区| 国产色一区二区| 成人黄色片在线观看| 国产精品三级久久久久三级| 懂色中文一区二区在线播放| 国产欧美日韩久久| 波多野结衣中文字幕一区二区三区 | 国产精品一区二区你懂的| 久久精品亚洲精品国产欧美kt∨| 国产乱码精品一区二区三| 国产亚洲欧美中文| 成人黄色综合网站| 一区二区三区在线视频播放| 欧美三级中文字幕| 日本一不卡视频| 精品免费日韩av| 国产福利91精品| 日韩一区欧美一区| 在线一区二区视频| 日韩国产一二三区| 精品国产百合女同互慰| 国产成人精品免费网站| 国产精品久久久久久久浪潮网站| 91视频在线看| 午夜久久电影网| 欧美白人最猛性xxxxx69交| 国产乱子轮精品视频| 国产精品麻豆欧美日韩ww| 色诱视频网站一区| 日产精品久久久久久久性色| www久久精品| 99久久免费精品高清特色大片| 一区二区三区国产豹纹内裤在线 | 欧美无乱码久久久免费午夜一区| 天堂av在线一区| 久久综合国产精品| 99久久精品99国产精品| 视频一区视频二区中文| 2017欧美狠狠色| 91黄色激情网站| 久久精品国产99国产| 日本一区二区三区dvd视频在线| 色综合天天天天做夜夜夜夜做| 午夜视频一区二区三区| 久久久久久久久久久99999| 97久久超碰国产精品| 日韩极品在线观看| 欧美国产一区二区在线观看| 日本韩国欧美一区二区三区| 日本欧美加勒比视频| 欧美国产综合一区二区| 欧美日韩一级大片网址| 国产一区 二区 三区一级| 亚洲欧美精品午睡沙发| 精品国产免费人成在线观看| 99精品视频在线观看免费| 免费在线观看成人| 亚洲天堂中文字幕| 欧美第一区第二区| 91蜜桃传媒精品久久久一区二区| 免费一区二区视频| 亚洲女同一区二区| 26uuu欧美日本| 欧美日韩在线综合| 成人av网站在线观看| 免费成人av在线播放| **性色生活片久久毛片| 精品日本一线二线三线不卡| 一本一本大道香蕉久在线精品 | k8久久久一区二区三区| 日韩电影在线观看一区| 亚洲欧洲成人精品av97| 精品精品国产高清a毛片牛牛 | 欧洲av在线精品| 国产福利一区在线| 日韩**一区毛片| 亚洲精品国产a| 国产亚洲欧美一级| 日韩欧美一级二级三级| 在线观看av一区二区| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 婷婷激情综合网| 国产精品白丝在线| 久久影院视频免费| 91精品国产丝袜白色高跟鞋| 91免费看`日韩一区二区| 国产乱码一区二区三区| 美女一区二区视频| 亚洲午夜激情网页| 亚洲男人天堂av| 国产精品亲子乱子伦xxxx裸| 欧美精品一区视频| 欧美一级xxx| 精品视频一区三区九区| 91免费看视频| av激情亚洲男人天堂| 国产精品1区2区3区在线观看| 日韩av网站免费在线| 亚洲一区二区三区中文字幕| 一区在线中文字幕| 国产日韩精品一区二区三区| 精品国产自在久精品国产| 欧美一区三区四区| 欧美日本免费一区二区三区| 色狠狠一区二区三区香蕉| 本田岬高潮一区二区三区| 国产成人av福利| 国产一区二区电影| 国产一区二区h| 国产一区二区成人久久免费影院 | 国产精品77777竹菊影视小说| 奇米精品一区二区三区四区| 婷婷综合久久一区二区三区| 亚洲一区二区三区三| 一区二区三区资源| 亚洲免费在线电影| 亚洲色图色小说| 亚洲欧美日韩一区| 亚洲日本在线看| 尤物在线观看一区| 一区二区三区在线视频免费| 一区二区三区在线视频免费观看| 亚洲人精品一区| 亚洲激情男女视频| 亚洲自拍偷拍麻豆| 亚洲第一狼人社区| 日本不卡123| 青青草原综合久久大伊人精品优势| 丝袜a∨在线一区二区三区不卡| 丝袜亚洲精品中文字幕一区| 日韩电影免费在线看| 开心九九激情九九欧美日韩精美视频电影| 天使萌一区二区三区免费观看| 青青国产91久久久久久| 国产综合色精品一区二区三区| 紧缚奴在线一区二区三区| 国产精品一区二区无线| 成人中文字幕在线| 97久久超碰国产精品电影| 日本大香伊一区二区三区| 在线观看亚洲一区| 欧美精品久久天天躁| 精品国产髙清在线看国产毛片| 久久先锋影音av鲁色资源| 国产精品免费视频一区| 一区二区三区中文字幕电影| 日韩精品五月天| 国产一区亚洲一区| 99视频在线精品| 欧美色爱综合网| 欧美成人国产一区二区| 日本一区二区三区dvd视频在线| 亚洲美女淫视频| 日本不卡一区二区三区 | 成人动漫中文字幕| 色香色香欲天天天影视综合网| 在线观看国产日韩| 日韩欧美中文字幕制服| 欧美激情一区二区三区在线| 亚洲激情校园春色| 久久精工是国产品牌吗| 成人午夜精品一区二区三区| 欧美优质美女网站| 日韩欧美精品三级| 国产精品美女视频| 五月天欧美精品| 国产成人精品一区二| 91福利小视频| 久久久亚洲精品石原莉奈| 亚洲免费视频成人| 日韩电影在线免费| 99精品欧美一区二区三区小说| 欧美另类久久久品| 国产精品无人区| 日韩一区欧美二区| 不卡一二三区首页| 日韩三级视频中文字幕| 国产精品久久久久7777按摩 | 亚洲成av人片在线观看无码| 极品少妇xxxx精品少妇偷拍| 91亚洲永久精品| 2020国产成人综合网| 亚洲国产精品一区二区久久恐怖片 | 亚洲男人天堂av网| 国产乱人伦偷精品视频免下载| 日本久久电影网| 久久久九九九九| 香蕉久久夜色精品国产使用方法| 国产成人丝袜美腿| 91麻豆精品国产91久久久使用方法 | 欧美三级视频在线播放|