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

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

?? tlp3nt.c

?? SmardCard Windows驅動
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*++

Copyright (C) 1997, 98 Microsoft Corporation

Module Name:

    bulltlp3.c

Abstract:

    Smart card driver for Bull TLP3 reader

Author:

    Klaus U. Schutz

Environment:

    Kernel mode

Revision History :

    Nov. 1997 - 1.0 Release
    Jan. 1998 - Fix for vendor defined IOCTLs
                TLP3SerialIo now writes the whole data packet if GT is 0
                Support for higher data rates added
    Feb. 1998 - PnP version

--*/

#include <stdio.h>
#include "bulltlp3.h"

#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGEABLE, TLP3CreateAndStartDevice)
#pragma alloc_text(PAGEABLE, TLP3StartSerialEventTracking)
#pragma alloc_text(PAGEABLE, TLP3AddDevice)
#pragma alloc_text(PAGEABLE, TLP3CreateDevice)
#pragma alloc_text(PAGEABLE, TLP3RemoveDevice)
#pragma alloc_text(PAGEABLE, TLP3DriverUnload)

#if DBG
#pragma optimize ("", off)
#endif

#ifdef SIMULATION
PWSTR DriverKey;
#endif

NTSTATUS
DriverEntry(
    IN  PDRIVER_OBJECT  DriverObject,
    IN  PUNICODE_STRING RegistryPath
    )
/*++

Routine Description:

    This routine is called at system initialization time to initialize
    this driver.

Arguments:

    DriverObject    - Supplies the driver object.
    RegistryPath    - Supplies the registry path for this driver.

Return Value:

    STATUS_SUCCESS          - We could initialize at least one device.
    STATUS_NO_SUCH_DEVICE   - We could not initialize even one device.

--*/
{
   NTSTATUS status = STATUS_SUCCESS;
   ULONG device;

    SmartcardDebug(
        DEBUG_INFO,
       ("%s!DriverEntry: Enter - %s %s\n",
        DRIVER_NAME,
        __DATE__,
        __TIME__)
        )

    //
    // we do some stuff in this driver that
    // assumes a single digit port number
    //
    ASSERT(MAXIMUM_SERIAL_READERS < 10);

    // Initialize the Driver Object with driver's entry points
    DriverObject->DriverUnload = TLP3DriverUnload;
    DriverObject->MajorFunction[IRP_MJ_CREATE] = TLP3CreateClose;
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = TLP3CreateClose;
    DriverObject->MajorFunction[IRP_MJ_CLEANUP] = TLP3Cleanup;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = TLP3DeviceControl;
    DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = TLP3SystemControl;
   DriverObject->MajorFunction[IRP_MJ_PNP]   = TLP3PnP;
   DriverObject->MajorFunction[IRP_MJ_POWER] = TLP3Power;
    DriverObject->DriverExtension->AddDevice = TLP3AddDevice;

#ifdef SIMULATION
   DriverKey = ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(L""));

   if (DriverKey) {

      RtlZeroMemory(
         DriverKey,
         RegistryPath->Length + sizeof(L"")
         );

      RtlCopyMemory(
         DriverKey,
         RegistryPath->Buffer,
         RegistryPath->Length
         );
   }
#endif

    return status;
}

NTSTATUS
TLP3AddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject
    )
/*++

Routine Description:

    This routine creates an object for the physical device specified and
    sets up the deviceExtension.

--*/
{
    PDEVICE_EXTENSION deviceExtension;
   NTSTATUS status = STATUS_SUCCESS;
   PREADER_EXTENSION readerExtension;
    PSMARTCARD_EXTENSION smartcardExtension;
   ULONG deviceInstance;
   HANDLE regKey = NULL;
   PDEVICE_OBJECT DeviceObject = NULL;

    // this is a list of our supported data rates
    static ULONG dataRatesSupported[] = { 9600, 19200, 38400, 57600, 115200 };


   SmartcardDebug(
      DEBUG_TRACE,
      ( "%s!TLP3AddDevice: Enter\n",
        DRIVER_NAME)
      );

    PAGED_CODE();

   __try {

      // Create the device object
      status = IoCreateDevice(
         DriverObject,
         sizeof(DEVICE_EXTENSION),
         NULL,
         FILE_DEVICE_SMARTCARD,
         0,
         TRUE,
         &DeviceObject
         );

      if (status != STATUS_SUCCESS) {

         SmartcardLogError(
            DriverObject,
            TLP3_CANT_CREATE_DEVICE,
            NULL,
            0
            );

         __leave;
      }

      SmartcardDebug(
         DEBUG_TRACE,
         ( "%s!TLP3CreateDevice: Device created\n",
         DRIVER_NAME)
         );

      // set up the device extension.
      deviceExtension = DeviceObject->DeviceExtension;
      smartcardExtension = &deviceExtension->SmartcardExtension;

      deviceExtension->CloseSerial = IoAllocateWorkItem(
         DeviceObject
         );

      // Used for stop / start notification
      KeInitializeEvent(
         &deviceExtension->ReaderStarted,
         NotificationEvent,
         FALSE
         );

      // Used to keep track of open close calls
      deviceExtension->ReaderOpen = FALSE;

      KeInitializeSpinLock(&deviceExtension->SpinLock);

      // Allocate data struct space for smart card reader
      smartcardExtension->ReaderExtension = ExAllocatePool(
         NonPagedPool,
         sizeof(READER_EXTENSION)
         );

      if (smartcardExtension->ReaderExtension == NULL) {

         SmartcardLogError(
            DriverObject,
            TLP3_NO_MEMORY,
            NULL,
            0
            );

         status = STATUS_INSUFFICIENT_RESOURCES;
         __leave;
      }

      readerExtension = smartcardExtension->ReaderExtension;
      RtlZeroMemory(readerExtension, sizeof(READER_EXTENSION));

      // Write the version of the lib we use to the smartcard extension
      smartcardExtension->Version = SMCLIB_VERSION;
      smartcardExtension->SmartcardRequest.BufferSize =
      smartcardExtension->SmartcardReply.BufferSize = MIN_BUFFER_SIZE;

      //
      // Now let the lib allocate the buffer for data transmission
      // We can either tell the lib how big the buffer should be
      // by assigning a value to BufferSize or let the lib
      // allocate the default size
      //
      status = SmartcardInitialize(smartcardExtension);

      if (status != STATUS_SUCCESS) {

         SmartcardLogError(
            DriverObject,
            (smartcardExtension->OsData ? TLP3_WRONG_LIB_VERSION : TLP3_NO_MEMORY),
            NULL,
            0
            );

         __leave;
      }

      // Save deviceObject
      smartcardExtension->OsData->DeviceObject = DeviceObject;

      // Set up call back functions
      smartcardExtension->ReaderFunction[RDF_TRANSMIT] = TLP3Transmit;
      smartcardExtension->ReaderFunction[RDF_SET_PROTOCOL] = TLP3SetProtocol;
      smartcardExtension->ReaderFunction[RDF_CARD_POWER] = TLP3ReaderPower;
      smartcardExtension->ReaderFunction[RDF_CARD_TRACKING] = TLP3CardTracking;
      smartcardExtension->ReaderFunction[RDF_IOCTL_VENDOR] = TLP3VendorIoctl;

      // This event signals that the serial driver has been closed
      KeInitializeEvent(
         &READER_EXTENSION_L(SerialCloseDone),
         NotificationEvent,
         TRUE
         );

      //
      // Set the vendor information
      //
      strcpy(smartcardExtension->VendorAttr.VendorName.Buffer, "Bull");

      smartcardExtension->VendorAttr.VendorName.Length =
         (USHORT) strlen(deviceExtension->SmartcardExtension.VendorAttr.VendorName.Buffer);

      strcpy(smartcardExtension->VendorAttr.IfdType.Buffer, "SmarTLP");

      smartcardExtension->VendorAttr.IfdType.Length =
            (USHORT) strlen(smartcardExtension->VendorAttr.IfdType.Buffer);

      smartcardExtension->VendorAttr.UnitNo = MAXULONG;

      for (deviceInstance = 0; deviceInstance < MAXULONG; deviceInstance++) {

         PDEVICE_OBJECT devObj;

         for (devObj = DeviceObject;
             devObj != NULL;
             devObj = devObj->NextDevice) {

             PDEVICE_EXTENSION devExt = devObj->DeviceExtension;
             PSMARTCARD_EXTENSION smcExt = &devExt->SmartcardExtension;

             if (deviceInstance == smcExt->VendorAttr.UnitNo) {

                break;
             }
         }
         if (devObj == NULL) {

            smartcardExtension->VendorAttr.UnitNo = deviceInstance;
            break;
         }
      }

      //
      // Set the reader capabilities
      //

      // Clk frequency in KHz encoded as little endian integer
      smartcardExtension->ReaderCapabilities.CLKFrequency.Default = 3571;
      smartcardExtension->ReaderCapabilities.CLKFrequency.Max = 3571;

      smartcardExtension->ReaderCapabilities.DataRate.Default =
      smartcardExtension->ReaderCapabilities.DataRate.Max =
         dataRatesSupported[0];

      // reader could support higher data rates
      smartcardExtension->ReaderCapabilities.DataRatesSupported.List =
         dataRatesSupported;
      smartcardExtension->ReaderCapabilities.DataRatesSupported.Entries =
         sizeof(dataRatesSupported) / sizeof(dataRatesSupported[0]);

      smartcardExtension->ReaderCapabilities.MaxIFSD = 254;

      // Now setup information in our deviceExtension
      smartcardExtension->ReaderCapabilities.CurrentState =
         (ULONG) SCARD_UNKNOWN;

      // This reader supports T=0 and T=1
      smartcardExtension->ReaderCapabilities.SupportedProtocols =
         SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1;

      smartcardExtension->ReaderCapabilities.MechProperties = 0;

      //
      // Set serial configuration parameters
      //
      readerExtension->SerialConfigData.BaudRate.BaudRate = 9600;

      readerExtension->SerialConfigData.LineControl.StopBits =
         STOP_BITS_2;
      readerExtension->SerialConfigData.LineControl.Parity =
         EVEN_PARITY;
      readerExtension->SerialConfigData.LineControl.WordLength =
         SERIAL_DATABITS_8;

      // set timeouts
      readerExtension->SerialConfigData.Timeouts.ReadIntervalTimeout =
         READ_INTERVAL_TIMEOUT_DEFAULT;
      readerExtension->SerialConfigData.Timeouts.ReadTotalTimeoutConstant =
         READ_TOTAL_TIMEOUT_CONSTANT_DEFAULT;
      readerExtension->SerialConfigData.Timeouts.ReadTotalTimeoutMultiplier = 0;

      // set special characters
      readerExtension->SerialConfigData.SerialChars.ErrorChar = 0;
      readerExtension->SerialConfigData.SerialChars.EofChar = 0;
      readerExtension->SerialConfigData.SerialChars.EventChar = 0;
      readerExtension->SerialConfigData.SerialChars.XonChar = 0;
      readerExtension->SerialConfigData.SerialChars.XoffChar = 0;
      readerExtension->SerialConfigData.SerialChars.BreakChar = 0xFF;

      // Set handflow
      readerExtension->SerialConfigData.HandFlow.XonLimit = 0;
      readerExtension->SerialConfigData.HandFlow.XoffLimit = 0;
      readerExtension->SerialConfigData.HandFlow.ControlHandShake = 0;
      readerExtension->SerialConfigData.HandFlow.FlowReplace =
         SERIAL_XOFF_CONTINUE;
#if defined (DEBUG) && defined (DETECT_SERIAL_OVERRUNS)
      readerExtension->SerialConfigData.HandFlow.ControlHandShake =
         SERIAL_ERROR_ABORT;
#endif

      // save the current power state of the reader
      readerExtension->ReaderPowerState = PowerReaderWorking;

        // and attach to the PDO
      ATTACHED_DEVICE_OBJECT =
            IoAttachDeviceToDeviceStack(
            DeviceObject,
            PhysicalDeviceObject
            );

        ASSERT(ATTACHED_DEVICE_OBJECT != NULL);

        if (ATTACHED_DEVICE_OBJECT == NULL) {

           SmartcardLogError(
              DriverObject,
              TLP3_CANT_CONNECT_TO_ASSIGNED_PORT,
              NULL,
              status
              );

            status = STATUS_UNSUCCESSFUL;
            __leave;
        }

        // register our new device
        status = IoRegisterDeviceInterface(
            PhysicalDeviceObject,
            &SmartCardReaderGuid,
            NULL,
            &deviceExtension->PnPDeviceName
            );
        ASSERT(status == STATUS_SUCCESS);

      DeviceObject->Flags |= DO_BUFFERED_IO;
      DeviceObject->Flags |= DO_POWER_PAGABLE;
      DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

   }
   __finally {

      if (regKey) {

         ZwClose(regKey);
      }

        if (status != STATUS_SUCCESS) {

            TLP3RemoveDevice(DeviceObject);
        }

      SmartcardDebug(
         DEBUG_TRACE,
         ( "%s!TLP3AddDevice: Exit %x\n",
         DRIVER_NAME,
         status)
         );
   }
   return status;
}

NTSTATUS
TLP3StartDevice(
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:
   Open the serial device, start card tracking and register our
    device interface. If any of the calls here fails we don't care
    to rollback since a stop will be called later which we then
    use to clean up.

--*/
{
    NTSTATUS status;
    PIRP irp;
      PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
   PSMARTCARD_EXTENSION smartcardExtension = &deviceExtension->SmartcardExtension;

   SmartcardDebug(
      DEBUG_TRACE,
      ( "%s!TLP3StartDevice: Enter\n",
        DRIVER_NAME)
      );

    irp = IoAllocateIrp(
        (CCHAR) (DeviceObject->StackSize + 1),
        FALSE
        );

    ASSERT(irp != NULL);

    if (irp == NULL) {

        return STATUS_NO_MEMORY;
    }

    _try {

        PIO_STACK_LOCATION irpStack;
        HANDLE handle = 0;
        IO_STATUS_BLOCK ioStatusBlock;

        //
        // Open the underlying serial driver.
        // This is necessary for two reasons:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91色视频在线| 亚洲va欧美va天堂v国产综合| 欧美日韩一区二区欧美激情| 99视频有精品| av中文字幕不卡| 97久久精品人人做人人爽| 成人免费看视频| 波多野结衣中文一区| 99国产精品久久久| 欧美曰成人黄网| 欧美色图12p| 在线播放亚洲一区| 精品欧美一区二区三区精品久久| 欧美一区二区在线不卡| 欧美不卡123| 国产精品毛片无遮挡高清| 中文字幕在线观看不卡| 一区二区在线观看视频| 久久国产综合精品| 高清国产一区二区| 不卡av电影在线播放| 91网站最新网址| 欧美大黄免费观看| 久久婷婷国产综合国色天香| 国产欧美日本一区视频| 一区二区三区高清| 蜜臀99久久精品久久久久久软件| 国产精品系列在线播放| 色综合夜色一区| 日韩欧美一级二级| 亚洲欧美一区二区三区国产精品 | 欧美大片在线观看一区二区| 国产欧美日韩三级| 亚洲一卡二卡三卡四卡 | 国产精品久久久久久久蜜臀| 夜夜嗨av一区二区三区四季av| 日韩电影在线看| 国产白丝精品91爽爽久久| 日本精品视频一区二区| 久久先锋影音av鲁色资源| 亚洲综合在线电影| 高清av一区二区| 制服丝袜av成人在线看| 国产精品久久久久久久久免费相片| 日日夜夜免费精品| 国产在线精品不卡| 国产一区二区三区免费观看 | ㊣最新国产の精品bt伙计久久| 亚洲成a人片综合在线| 国产福利精品一区二区| 欧美精品视频www在线观看| 欧美国产日韩亚洲一区| 久久99热99| 欧美日精品一区视频| 国产精品久久久久久久第一福利| 美女爽到高潮91| 欧美日韩在线播放| 亚洲欧美另类在线| 成人污污视频在线观看| 精品国产免费一区二区三区四区 | 美洲天堂一区二卡三卡四卡视频| 国产成人欧美日韩在线电影| 91精品国产色综合久久不卡蜜臀| 一区二区三区在线影院| jlzzjlzz国产精品久久| 欧美精品一区二区三区高清aⅴ| 亚洲bt欧美bt精品777| 色久优优欧美色久优优| 亚洲人妖av一区二区| 高清不卡一二三区| 欧美激情自拍偷拍| 粉嫩av一区二区三区粉嫩| 国产欧美一区二区精品性色超碰| 久久成人久久鬼色| 26uuu欧美日本| 久久精品av麻豆的观看方式| 欧美一区二区美女| 免费在线看成人av| 精品久久人人做人人爽| 国产在线精品一区二区三区不卡| 亚洲精品在线观看网站| 精品无人码麻豆乱码1区2区| 亚洲精品在线观| 国产电影一区二区三区| 国产精品福利av| 91精品办公室少妇高潮对白| 亚洲精品精品亚洲| 欧美日韩一级二级| 毛片av一区二区三区| 久久久久久久久99精品| 成人av在线一区二区三区| 最新高清无码专区| 欧美日韩在线综合| 免费人成黄页网站在线一区二区| 欧美成人一区二区三区在线观看| 国产一区二区在线视频| 欧美激情在线免费观看| 欧美亚日韩国产aⅴ精品中极品| 性做久久久久久免费观看欧美| 日韩亚洲欧美一区| 成人免费观看视频| 亚洲高清不卡在线| 国产精品盗摄一区二区三区| 色综合久久久久久久久| 青青草成人在线观看| 中文在线免费一区三区高中清不卡| 91福利视频网站| 国产一区二区看久久| 亚洲欧美视频在线观看| 日韩午夜激情视频| 色综合天天综合给合国产| 美女在线一区二区| 亚洲天堂网中文字| 欧美成人国产一区二区| 色偷偷一区二区三区| 久久99国产精品麻豆| 一区二区三区小说| 欧美精品一区二区高清在线观看| 色屁屁一区二区| 国产一区激情在线| 日韩精品1区2区3区| 亚洲男人的天堂在线观看| 久久伊人中文字幕| 在线播放中文一区| 色婷婷综合视频在线观看| 国产在线乱码一区二区三区| 一二三四社区欧美黄| 中文字幕高清一区| 欧美成人伊人久久综合网| 欧美日韩在线亚洲一区蜜芽| 99久久国产综合精品色伊| 国产揄拍国内精品对白| 日韩电影在线观看电影| 亚洲黄色在线视频| 国产精品拍天天在线| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 欧美日韩成人在线一区| 91最新地址在线播放| 国产成人精品综合在线观看| 奇米一区二区三区| 天天色天天操综合| 亚洲成人动漫av| 一区二区三区 在线观看视频 | 亚洲在线中文字幕| 日韩码欧中文字| 亚洲欧洲成人精品av97| 国产精品不卡视频| 国产精品成人免费| 18成人在线观看| 亚洲欧洲国产专区| 亚洲精品乱码久久久久久黑人| 中文字幕制服丝袜成人av | 亚洲www啪成人一区二区麻豆| 亚洲精品午夜久久久| 亚洲最新视频在线观看| 亚洲日本在线a| 亚洲小说欧美激情另类| 亚洲成年人网站在线观看| 五月婷婷久久综合| 日韩成人免费看| 韩国视频一区二区| 国产成人综合亚洲网站| 不卡一区在线观看| 色综合天天综合色综合av| 亚洲精品一区二区三区香蕉| 91精品国产91久久久久久最新毛片 | 国产一区二区三区四区五区美女 | 一区二区三区四区激情| 亚洲成人动漫在线观看| 蜜桃一区二区三区在线| 国产一区二区三区美女| 国产精品亚洲专一区二区三区| 春色校园综合激情亚洲| 色综合久久久久综合体桃花网| 欧美性猛交xxxx黑人交| 日韩欧美一区在线| 日本一区二区电影| 亚洲国产美女搞黄色| 日本一道高清亚洲日美韩| 国产黄人亚洲片| 欧美亚洲动漫另类| 久久综合久久综合亚洲| **网站欧美大片在线观看| 三级亚洲高清视频| 国产suv精品一区二区三区| 欧洲一区二区三区在线| 欧美一区二区啪啪| 中文字幕在线一区| 欧美bbbbb| 91久久精品午夜一区二区| 欧美精品一区二区不卡| 一区二区三区资源| 国产精品一区免费视频| 欧美情侣在线播放| 国产精品免费视频一区| 另类成人小视频在线| 91麻豆国产福利在线观看| 久久综合九色综合欧美98 | 久久精品国产亚洲高清剧情介绍 | 久久综合色一综合色88|