亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
精品国产乱码久久久久久图片 | 99精品在线免费| 欧美日韩一级片网站| 久久久天堂av| 午夜一区二区三区视频| www.av亚洲| 欧美精品一区二区三区久久久| 亚洲精品老司机| 国产精品白丝jk黑袜喷水| 欧美日韩综合在线免费观看| 国产精品视频九色porn| 久久精品久久精品| 欧美日韩在线播| 一区免费观看视频| 国产一区二区在线观看免费| 欧美精品三级在线观看| 亚洲男同1069视频| 成人午夜精品一区二区三区| 精品久久久久久久久久久院品网| 亚洲国产精品一区二区久久恐怖片| 成人午夜视频福利| 国产欧美综合在线| 国产精品正在播放| 久久免费的精品国产v∧| 免费xxxx性欧美18vr| 欧美日韩精品综合在线| 亚洲一区二区三区四区的| 色综合久久88色综合天天6| 成人欧美一区二区三区视频网页 | 欧美一区二区视频在线观看 | 26uuu精品一区二区三区四区在线| 亚洲电影在线播放| 欧美久久久久久久久中文字幕| 亚洲亚洲人成综合网络| 在线亚洲+欧美+日本专区| 亚洲欧美偷拍另类a∨色屁股| 不卡一区中文字幕| 亚洲婷婷在线视频| 色婷婷激情一区二区三区| 玉米视频成人免费看| 一本色道久久综合亚洲aⅴ蜜桃| ...av二区三区久久精品| 91免费看视频| 亚洲精品va在线观看| 欧美日韩在线一区二区| 麻豆国产欧美日韩综合精品二区| 日韩欧美一区二区三区在线| 狠狠色综合色综合网络| 久久夜色精品国产噜噜av| 国产黑丝在线一区二区三区| 国产精品欧美一区二区三区| 色香蕉久久蜜桃| 日韩电影一区二区三区四区| 26uuu另类欧美亚洲曰本| 成人动漫一区二区| 五月婷婷综合在线| 久久综合精品国产一区二区三区| 丁香婷婷综合激情五月色| 亚洲欧美另类小说视频| 欧美顶级少妇做爰| 国产精品一区二区三区网站| 亚洲人成网站色在线观看| 6080日韩午夜伦伦午夜伦| 国产一区91精品张津瑜| 亚洲激情第一区| 日韩女优电影在线观看| 99re热这里只有精品视频| 午夜精品福利一区二区三区av| 久久色在线视频| 91猫先生在线| 九九热在线视频观看这里只有精品| 中文文精品字幕一区二区| 欧美亚洲动漫制服丝袜| 国产伦精品一区二区三区视频青涩| 国产精品国产馆在线真实露脸| 91精品久久久久久久99蜜桃| 成人晚上爱看视频| 日韩av网站在线观看| 国产精品高潮久久久久无| 日韩欧美不卡一区| 91国产福利在线| 成人黄色小视频| 日韩精品一级中文字幕精品视频免费观看 | 亚洲一级二级三级在线免费观看| 精品少妇一区二区三区免费观看 | 91精品国模一区二区三区| kk眼镜猥琐国模调教系列一区二区| 调教+趴+乳夹+国产+精品| 成人免费在线播放视频| 欧美mv和日韩mv国产网站| 欧美日韩一区二区三区视频| 成人黄色在线看| 国产一区三区三区| 免费欧美在线视频| 免费一区二区视频| 欧美国产日韩a欧美在线观看| 欧美肥大bbwbbw高潮| 91国产精品成人| 99久久亚洲一区二区三区青草| 久久国产欧美日韩精品| 奇米色一区二区| 天堂成人国产精品一区| 午夜影院在线观看欧美| 一区二区三区在线视频观看58 | 欧美高清视频不卡网| 一本到高清视频免费精品| 成人精品视频一区二区三区尤物| 韩国精品一区二区| 久久er精品视频| 九九九精品视频| 久久99国产精品免费| 黄色成人免费在线| 国产在线不卡一区| 国产成人在线免费| 国产91在线看| 成人污污视频在线观看| kk眼镜猥琐国模调教系列一区二区| 国产成人精品免费视频网站| 丁香六月综合激情| 成人免费视频网站在线观看| 99精品热视频| 91久久精品一区二区| 精品88久久久久88久久久| 精品国产乱码久久久久久久久| 精品av久久707| 久久久天堂av| 自拍偷拍亚洲欧美日韩| 亚洲美女屁股眼交| 亚洲国产精品精华液网站| 青青草国产精品97视觉盛宴 | 亚洲综合成人网| 日韩精品色哟哟| 免费国产亚洲视频| 国产999精品久久久久久绿帽| 成人高清视频免费观看| 欧美在线观看视频一区二区三区| 欧美日韩一区三区四区| 日韩一区二区电影| 久久综合中文字幕| 中文字幕一区二区三区四区 | 色婷婷av一区二区三区大白胸| 日本韩国精品一区二区在线观看| 欧美日韩一区视频| 久久久www成人免费无遮挡大片| 国产精品久久99| 亚洲大片在线观看| 国产精品亚洲一区二区三区妖精 | 自拍偷拍亚洲欧美日韩| 无码av免费一区二区三区试看| 久久99国产乱子伦精品免费| caoporn国产精品| 欧美美女一区二区三区| 久久女同性恋中文字幕| 一二三四社区欧美黄| 久久成人免费日本黄色| 99精品视频一区| 精品福利一二区| 亚洲精品日韩一| 狠狠色丁香久久婷婷综| 在线国产亚洲欧美| 国产亚洲精久久久久久| 亚洲成人av一区二区| 成人午夜看片网址| 日韩一区二区三区在线| 亚洲精品视频在线| 福利一区在线观看| 4438x亚洲最大成人网| 国产精品传媒在线| 精品在线播放免费| 欧美日韩精品一区二区三区 | 精品国产免费久久| 亚洲精品免费一二三区| 国产高清亚洲一区| 欧美一区二区观看视频| 亚洲自拍偷拍av| 99久久免费国产| 精品国产a毛片| 日本不卡一二三| 欧美视频在线播放| 亚洲免费av网站| 国产成人av一区| 久久麻豆一区二区| 美脚の诱脚舐め脚责91 | 成人性生交大合| 久久久精品中文字幕麻豆发布| 日本欧美久久久久免费播放网| 欧美午夜一区二区三区免费大片| 国产精品色噜噜| 国产成人午夜视频| 国产午夜亚洲精品午夜鲁丝片| 久久成人18免费观看| 7777精品伊人久久久大香线蕉完整版 | 国产精品久久夜| 国产一区二区三区综合| 欧美电影免费观看高清完整版在| 日韩精品一二三四| 日韩一区二区麻豆国产| 麻豆成人久久精品二区三区红 | 久久精品一区二区三区四区| 精久久久久久久久久久|