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

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

?? tlp3nt.c

?? SmardCard Windows驅動
?? C
?? 第 1 頁 / 共 5 頁
字號:
   SmartcardDebug(
      DEBUG_INFO,
      ( "%s!TLP3RemoveDevice: Exit\n",
        DRIVER_NAME)
      );
}

VOID
TLP3DriverUnload(
    IN PDRIVER_OBJECT DriverObject
    )
/*++

Routine Description:
    The driver unload routine.  This is called by the I/O system
    when the device is unloaded from memory.

Arguments:
    DriverObject - Pointer to driver object created by system.

Return Value:
    STATUS_SUCCESS.

--*/
{
    PAGED_CODE();

    SmartcardDebug(
        DEBUG_INFO,
        ("%s!TLP3DriverUnload\n",
        DRIVER_NAME)
        );
}

NTSTATUS
TLP3ConfigureSerialPort(
    PSMARTCARD_EXTENSION SmartcardExtension
    )

/*++

Routine Description:

    This routine will appropriately configure the serial port.
    It makes synchronous calls to the serial port.

Arguments:

    SmartcardExtension - Pointer to smart card struct

Return Value:

    NTSTATUS

--*/

{
    PSERIAL_READER_CONFIG configData = &SmartcardExtension->ReaderExtension->SerialConfigData;
    NTSTATUS status = STATUS_SUCCESS;
    USHORT i;
   PUCHAR request = SmartcardExtension->SmartcardRequest.Buffer;

   SmartcardExtension->SmartcardRequest.BufferLength = 0;
   SmartcardExtension->SmartcardReply.BufferLength =
      SmartcardExtension->SmartcardReply.BufferSize;

   for (i = 0; status == STATUS_SUCCESS; i++) {

        switch (i) {

         case 0:
             //
             // Set up baudrate for the TLP3 reader
             //
            SmartcardExtension->ReaderExtension->SerialIoControlCode =
               IOCTL_SERIAL_SET_BAUD_RATE;

             SmartcardExtension->SmartcardRequest.Buffer =
               (PUCHAR) &configData->BaudRate;

            SmartcardExtension->SmartcardRequest.BufferLength =
               sizeof(SERIAL_BAUD_RATE);

            break;

           case 1:
               //
               // Set up line control parameters
               //
            SmartcardExtension->ReaderExtension->SerialIoControlCode =
                 IOCTL_SERIAL_SET_LINE_CONTROL;

             SmartcardExtension->SmartcardRequest.Buffer =
                  (PUCHAR) &configData->LineControl;

            SmartcardExtension->SmartcardRequest.BufferLength =
                  sizeof(SERIAL_LINE_CONTROL);
               break;

           case 2:
               //
               // Set serial special characters
               //
            SmartcardExtension->ReaderExtension->SerialIoControlCode =
                 IOCTL_SERIAL_SET_CHARS;

            SmartcardExtension->SmartcardRequest.Buffer =
                  (PUCHAR) &configData->SerialChars;

            SmartcardExtension->SmartcardRequest.BufferLength =
                  sizeof(SERIAL_CHARS);
               break;

           case 3:
               //
               // Set up timeouts
               //
            SmartcardExtension->ReaderExtension->SerialIoControlCode =
               IOCTL_SERIAL_SET_TIMEOUTS;

             SmartcardExtension->SmartcardRequest.Buffer =
                  (PUCHAR) &configData->Timeouts;

            SmartcardExtension->SmartcardRequest.BufferLength =
                  sizeof(SERIAL_TIMEOUTS);
               break;

           case 4:
               // Set flowcontrol and handshaking
            SmartcardExtension->ReaderExtension->SerialIoControlCode =
                 IOCTL_SERIAL_SET_HANDFLOW;

             SmartcardExtension->SmartcardRequest.Buffer =
                  (PUCHAR) &configData->HandFlow;

            SmartcardExtension->SmartcardRequest.BufferLength =
                  sizeof(SERIAL_HANDFLOW);
               break;

           case 5:
               // Set break off
            SmartcardExtension->ReaderExtension->SerialIoControlCode =
                 IOCTL_SERIAL_SET_BREAK_OFF;
               break;

         case 6:
                // set DTR for the reader
              SmartcardExtension->ReaderExtension->SerialIoControlCode =
               IOCTL_SERIAL_SET_DTR;
            break;

         case 7:
              SmartcardExtension->ReaderExtension->SerialIoControlCode =
               IOCTL_SERIAL_SET_RTS;
            break;

         case 8:
             return STATUS_SUCCESS;
        }

       status = TLP3SerialIo(SmartcardExtension);
       

      // restore pointer to original request buffer
      SmartcardExtension->SmartcardRequest.Buffer = request;
    }
    
    return status;
}

NTSTATUS
TLP3StartSerialEventTracking(
    PSMARTCARD_EXTENSION SmartcardExtension
   )
/*++

Routine Description:

    This routine initializes serial event tracking.
    It calls the serial driver to set a wait mask for CTS and DSR tracking.

--*/
{
    NTSTATUS status;
    PREADER_EXTENSION readerExtension = SmartcardExtension->ReaderExtension;
   IO_STATUS_BLOCK ioStatus;
   KEVENT event;

    PAGED_CODE();

    readerExtension->SerialConfigData.SerialWaitMask =
        SERIAL_EV_CTS | SERIAL_EV_DSR;

    KeInitializeEvent(
        &event,
        NotificationEvent,
        FALSE
        );

   //
   // Send a wait mask to the serial driver. This call only sets the
    // wait mask. We want to be informed when CTS or DSR changes its state
   //
    readerExtension->SerialStatusIrp = IoBuildDeviceIoControlRequest(
      IOCTL_SERIAL_SET_WAIT_MASK,
      readerExtension->AttachedDeviceObject,
        &readerExtension->SerialConfigData.SerialWaitMask,
        sizeof(readerExtension->SerialConfigData.SerialWaitMask),
        NULL,
      0,
        FALSE,
        &event,
        &ioStatus
        );

    if (readerExtension->SerialStatusIrp == NULL) {

        return STATUS_INSUFFICIENT_RESOURCES;
    }

    status = IoCallDriver(
      readerExtension->AttachedDeviceObject,
      readerExtension->SerialStatusIrp,
      );

   if (status == STATUS_PENDING) {

        status = KeWaitForSingleObject(
            &event,
            Executive,
            KernelMode,
            FALSE,
            NULL
            );
        ASSERT(status == STATUS_SUCCESS);

      status = ioStatus.Status;
   }

   if (status == STATUS_SUCCESS) {

      KIRQL oldIrql;
      LARGE_INTEGER delayPeriod;
      PIO_STACK_LOCATION irpSp;

      //
      // Now tell the serial driver that we want to be informed
      // when CTS or DSR changes its state.
      //
      readerExtension->SerialStatusIrp = IoAllocateIrp(
         (CCHAR) (SmartcardExtension->OsData->DeviceObject->StackSize + 1),
         FALSE
         );

       if (readerExtension->SerialStatusIrp == NULL) {

           return STATUS_INSUFFICIENT_RESOURCES;
       }

       irpSp = IoGetNextIrpStackLocation( readerExtension->SerialStatusIrp );
      irpSp->MajorFunction = IRP_MJ_DEVICE_CONTROL;

      irpSp->Parameters.DeviceIoControl.InputBufferLength = 0;
      irpSp->Parameters.DeviceIoControl.OutputBufferLength =
         sizeof(readerExtension->SerialConfigData.SerialWaitMask);
      irpSp->Parameters.DeviceIoControl.IoControlCode =
         IOCTL_SERIAL_WAIT_ON_MASK;

      readerExtension->SerialStatusIrp->AssociatedIrp.SystemBuffer =
         &readerExtension->SerialConfigData.SerialWaitMask;

      //
      // this artificial delay is necessary to make this driver work
      // with digi board cards
      //
      delayPeriod.HighPart = -1;
      delayPeriod.LowPart = 100l * 1000 * (-10);

        KeDelayExecutionThread(
            KernelMode,
            FALSE,
            &delayPeriod
            );

        // We simulate a callback now that triggers the card supervision
        TLP3SerialEvent(
            SmartcardExtension->OsData->DeviceObject,
            readerExtension->SerialStatusIrp,
            SmartcardExtension
            );

      status = STATUS_SUCCESS;
   }

    return status;
}

VOID
TLP3CompleteCardTracking(
    IN PSMARTCARD_EXTENSION SmartcardExtension
    )
{
    KIRQL ioIrql, keIrql;
    PIRP notificationIrp;

    IoAcquireCancelSpinLock(&ioIrql);
    KeAcquireSpinLock(
        &SmartcardExtension->OsData->SpinLock,
        &keIrql
        );

    notificationIrp = SmartcardExtension->OsData->NotificationIrp;
    SmartcardExtension->OsData->NotificationIrp = NULL;

    KeReleaseSpinLock(
        &SmartcardExtension->OsData->SpinLock,
        keIrql
        );

    if (notificationIrp) {

        IoSetCancelRoutine(
            notificationIrp,
            NULL
            );
    }

    IoReleaseCancelSpinLock(ioIrql);

    if (notificationIrp) {

      SmartcardDebug(
         DEBUG_INFO,
         ("%s!TLP3CompleteCardTracking: Completing NotificationIrp %lxh\n",
            DRIVER_NAME,
            notificationIrp)
         );

       //   finish the request
        if (notificationIrp->Cancel) {

           notificationIrp->IoStatus.Status = STATUS_CANCELLED;

        } else {

           notificationIrp->IoStatus.Status = STATUS_SUCCESS;
        }
       notificationIrp->IoStatus.Information = 0;

       IoCompleteRequest(
            notificationIrp,
            IO_NO_INCREMENT
            );
    }
}

NTSTATUS
TLP3SerialEvent(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PSMARTCARD_EXTENSION SmartcardExtension
    )
/*++

Routine Description:

    This routine is called in two cases:
    a) CTS changed (card inserted or removed) or
    b) DSR changed (reader has been removed)

    For a) we update the card status and complete outstanding
    card tracking requests.
    For b) we start to unload the driver

    NOTE: This function calls itself using IoCompletion. In the 'first'
    callback the serial driver only tells us that something has changed.
    We set up a call for 'what has changed' (GetModemStatus) which then
    call this function again.
    When we updated everything and we don't unload the driver card
    tracking is started again.

--*/
{
   NTSTATUS status;
    KIRQL irql;

    KeAcquireSpinLock(
        &SmartcardExtension->OsData->SpinLock,
        &irql
        );

   if (SmartcardExtension->ReaderExtension->GetModemStatus) {

      //
      // This function requested the modem status previously.
        // As part of the io-completion, this function is then
        // called again. When we're here we can read the actual
        // modem-status to figure out if the card is in the reader
      //
      if ((SmartcardExtension->ReaderExtension->ModemStatus & SERIAL_DSR_STATE) == 0) {

         SmartcardDebug(
            DEBUG_INFO,
            ("%s!TLP3SerialEvent: Reader removed\n",
                DRIVER_NAME)
            );

            //
            // We set the mask to zero to signal that we can
            // release the irp that we use for the serial events
            //
            SmartcardExtension->ReaderExtension->SerialConfigData.SerialWaitMask = 0;
         SmartcardExtension->ReaderCapabilities.CurrentState = SCARD_UNKNOWN;

        } else {

          if (SmartcardExtension->ReaderExtension->ModemStatus & SERIAL_CTS_STATE) {

             // Card is inserted
               SmartcardExtension->ReaderCapabilities.CurrentState =
                    SCARD_SWALLOWED;

             SmartcardExtension->CardCapabilities.Protocol.Selected =
                SCARD_PROTOCOL_UNDEFINED;

             SmartcardDebug(
                DEBUG_INFO,
                ("%s!TLP3SerialEvent: Smart card inserted\n",
                    DRIVER_NAME)
                );

          } else {

             // Card is removed
                SmartcardExtension->CardCapabilities.ATR.Length = 0;

               SmartcardExtension->ReaderCapabilities.CurrentState =
                SCARD_ABSENT;

             SmartcardExtension->CardCapabilities.Protocol.Selected =
                SCARD_PROTOCOL_UNDEFINED;

             SmartcardDebug(
                DEBUG_INFO,
                ("%s!TLP3SerialEvent: Smart card removed\n",
                    DRIVER_NAME)
                );
          }
        }
    }

   KeReleaseSpinLock(
      &SmartcardExtension->OsData->SpinLock,
      irql
      );

   //
   // Only inform the user of a card insertion/removal event
   // if this function isn't called due to a power down - power up cycle
   //
   if (SmartcardExtension->ReaderExtension->PowerRequest == FALSE) {

        TLP3CompleteCardTracking(SmartcardExtension);
   }

    // The wait mask is set to 0 when the driver unloads
   if (SmartcardExtension->ReaderExtension->SerialConfigData.SerialWaitMask == 0) {

        // The reader has been unplugged.
        PDEVICE_EXTENSION deviceExtension =
            SmartcardExtension->OsData->DeviceObject->DeviceExtension;

        // schedule our remove thread
      IoQueueWorkItem(
         deviceExtension->CloseSerial,
            (PIO_WORKITEM_ROUTINE) TLP3CloseSerialPort,
         DelayedWorkQueue,
            NULL
         );

        SmartcardDebug(
            DEBUG_TRAC

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩国产在线观看一区| 国产亚洲美州欧州综合国| 亚洲免费在线观看视频| 91丨porny丨户外露出| 怡红院av一区二区三区| 在线不卡欧美精品一区二区三区| 一区二区三区欧美视频| 欧美日韩国产欧美日美国产精品| 日韩黄色一级片| 亚洲精品一区二区精华| 高清beeg欧美| 一区二区三区日韩在线观看| 欧美高清dvd| 国产99久久久国产精品潘金 | 亚洲国产精品久久不卡毛片| 欧美视频一区二| 久久99蜜桃精品| 国产精品女同一区二区三区| 在线一区二区观看| 美国十次综合导航| 国产精品美女一区二区三区 | 欧美日韩国产综合草草| 免费成人在线播放| 国产精品欧美极品| 欧美二区乱c少妇| 国产福利视频一区二区三区| 亚洲精品视频在线看| 3d动漫精品啪啪一区二区竹菊| 美女网站一区二区| 18成人在线观看| 日韩一区二区免费在线电影| 成人黄色在线看| 三级一区在线视频先锋| 久久久久综合网| 91国偷自产一区二区开放时间 | 亚洲国产精品99久久久久久久久 | 国产日韩影视精品| 欧美午夜精品理论片a级按摩| 黄网站免费久久| 亚洲一区二区黄色| 国产视频一区不卡| 欧美人牲a欧美精品| 床上的激情91.| 毛片一区二区三区| 亚洲精品高清在线观看| 欧美va亚洲va国产综合| av午夜一区麻豆| 国产资源在线一区| 五月天婷婷综合| 亚洲美女偷拍久久| 中文字幕乱码一区二区免费| 欧美一卡二卡三卡| 欧美日本韩国一区二区三区视频| 99精品视频一区二区三区| 国产精品一区在线观看你懂的| 亚洲成人一二三| 亚洲乱码国产乱码精品精可以看| 久久精品网站免费观看| 日韩欧美久久久| 欧美放荡的少妇| 欧美色电影在线| 色噜噜狠狠成人网p站| 成人在线视频首页| 国产一区二区三区在线观看免费视频| 亚洲va欧美va人人爽| 国产精品久久久久四虎| 久久久91精品国产一区二区三区| 日韩一级高清毛片| 在线不卡的av| 日韩一区二区视频| 91麻豆精品国产91久久久更新时间 | 日韩欧美123| 欧美精品tushy高清| 欧美日韩一级二级三级| 欧美色综合网站| 欧美亚男人的天堂| 欧美在线观看18| 欧美日韩国产综合一区二区 | 亚洲一区二区三区三| 一区二区在线观看免费| 悠悠色在线精品| 亚洲综合av网| 亚洲成人av一区二区三区| 亚洲bt欧美bt精品777| 偷拍自拍另类欧美| 麻豆成人久久精品二区三区小说| 日本成人中文字幕在线视频| 毛片av一区二区| 国产一区日韩二区欧美三区| 国产一区欧美一区| 成人精品一区二区三区四区| 成人av在线电影| 色欧美88888久久久久久影院| 91福利视频在线| 欧美精品日韩一本| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 欧美女孩性生活视频| 91麻豆精品国产91久久久久| 91精品国产综合久久久久久| 日韩精品资源二区在线| 国产欧美1区2区3区| 综合分类小说区另类春色亚洲小说欧美| 最新日韩av在线| 亚洲va韩国va欧美va| 久久99国产精品久久99果冻传媒 | 国产一区二区三区不卡在线观看| 国产激情一区二区三区| 91免费国产视频网站| 欧美日韩午夜在线| 精品sm捆绑视频| 日韩毛片一二三区| 亚洲国产日韩一区二区| 蜜臂av日日欢夜夜爽一区| 国产成人aaa| 欧美亚洲一区二区在线| 2023国产精品| 一区二区三区四区在线免费观看 | 国内成+人亚洲+欧美+综合在线| 福利一区在线观看| 欧美四级电影网| 国产欧美精品一区二区色综合朱莉 | av在线播放不卡| 日韩精品专区在线影院重磅| 中文字幕在线不卡视频| 青青草国产成人av片免费| 不卡的av网站| 日韩精品在线网站| 一区二区三区在线观看欧美| 久久99热国产| 欧美日韩一区二区在线观看| 久久久久国产精品人| 三级欧美在线一区| 91香蕉视频mp4| 久久众筹精品私拍模特| 亚洲成人免费影院| 成人一级黄色片| 日韩精品一区二区三区蜜臀 | 国产黄色精品网站| 欧美一区二区黄色| 亚洲一区二区视频在线观看| 国产九九视频一区二区三区| 在线不卡免费av| 一区二区三区视频在线看| 成人性生交大合| www久久精品| 日本最新不卡在线| 欧美在线观看一区二区| 久久精品国产亚洲高清剧情介绍| www.视频一区| 久久精品无码一区二区三区| 蜜臀精品久久久久久蜜臀| 欧美日韩亚洲高清一区二区| 亚洲免费在线视频| 99麻豆久久久国产精品免费优播| 欧美精品一区二区三区很污很色的 | 中文字幕电影一区| 国产一本一道久久香蕉| 欧美mv日韩mv国产网站| 免费观看30秒视频久久| 欧美电影一区二区| 亚洲最大成人网4388xx| 一本大道久久a久久综合| 国产精品久久久久桃色tv| 国产成人亚洲综合色影视| 久久久久综合网| 国产精品亚洲一区二区三区妖精 | 成人午夜视频福利| 国产欧美va欧美不卡在线| 国产乱码一区二区三区| 亚洲精品在线免费播放| 精品影视av免费| 久久嫩草精品久久久精品一| 国产曰批免费观看久久久| 久久久久综合网| 成人综合日日夜夜| 亚洲欧洲无码一区二区三区| 91视频精品在这里| 亚洲一区二区三区中文字幕在线| 欧美亚洲动漫另类| 日日夜夜精品视频天天综合网| 91精品国产免费| 激情综合色播激情啊| 国产欧美视频一区二区| www.99精品| 亚洲国产一区二区视频| 欧美一区二区视频在线观看2022| 蜜臀av性久久久久av蜜臀妖精| 精品国产麻豆免费人成网站| 国产精品一区二区久久不卡| 中文字幕亚洲电影| 在线观看免费亚洲| 日韩—二三区免费观看av| 久久一区二区视频| 99免费精品在线| 五月天久久比比资源色| 久久尤物电影视频在线观看| av在线免费不卡| 三级欧美韩日大片在线看| 欧美精品一区二区三区在线播放| 北条麻妃国产九九精品视频|