⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcsc_drv.h

📁 Skeleton for implementing a Windows PC/SC Smartcard Reader.
💻 H
字号:
// =====[pcsc_drv.h]=========================================================================
//  Description:        Header file (pcsc_drv.h)
//  Compiled:           MS-VC++
//  Version:            .NET
//  Revisions:
//  REV         DATE                BY           DESCRIPTION
//  ------  --------------      ----------    --------------------------------------
//  1.01      2001/01/01           BDS           Initial version.
//    
//  This header file (pcsc_drv.h) is  Copyright(c) 2001 Dmitry Basko. 
//  Redistribution and use in source and binary forms, with or without
//  modification, are permitted provided that: 
//  1.  source code distributions retain the above copyright notice and this 
//      paragraph in its entirety;
//  2.  distributions including binary code include the above copyright notice
//      and this paragraph in its entirety in the documentation or other materials
//      provided with the distribution;
//  3.  all advertising materials mentioning features or use of this software 
//      display the following acknowledgement;
//  "This product includes software developed by Dmitry Basko."
//  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
//  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
//  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
// ========================================================================================= 

#pragma once
#ifndef DRIVER_H
#define DRIVER_H
// This programm is compiled ONLY for WIN32 and M_IX86 processor
#if defined(_WIN32) && defined(_M_IX86)

#undef USE_SYSTEM_THREAD
#define USE_WORK_THREAD
#define TRY_PASS_MICROSOFT_TEST
#define VERSION_READER_2
#define USE_EVENT_LOG
#pragma warning(push, 1)
extern "C" 
{
#include <NTDDK.h>
}
#include <DEVIOCTL.H>
#include <WINSMCRD.h>
#include <SMCLIB.h>
#include "Msg.h"

#pragma warning(pop) 

#define CARD_PRESENT                    TRUE
#define CARD_NOPRESENT                  FALSE
#define SMARTCARD_POOL_TAG              '_CS'
#define NOTIFICATIONEVENT_NAME          L"\\BaseNamedObjects\\SC_INSERT_REMOVE"
#define STATUS_WRONG_IRQL               ((NTSTATUS)0xC0040100L)
#define MEMORY_BUF_SIZE                 128
#define FILE_NAME                       L"\\??\\c:\\card.bin"
#define IOCTL_CREATE_EVENT 	            SCARD_CTL_CODE( 3000 )

#define READER_EXTENSION(member)        (pSmartcardExtension->ReaderExtension->member)
#define DEVICE_READER_EXTENSION(member) (pDeviceExtension->SmartcardExtension.ReaderExtension->member)

#define HEAD                             "PCSC_DRV: "

#define POWER_DOWN                      0
#define POWER_UP                        1

#define REGISTERDEVICEINTERFACE
#ifdef USE_EVENT_LOG
// Error-logging verbosity levels
#define LOG_LEVEL_NONE			         0
#define LOG_LEVEL_NORMAL		         1
#define LOG_LEVEL_DEBUG			         2

#define  DEFAULT_LOG_LEVEL	LOG_LEVEL_DEBUG
// Unique values identifying location  of an error within the driver 
#define ERRORLOG_INIT				      1
#define ERRORLOG_DRIVERENTRY		      2
#define ERRORLOG_DRIVERENTRY_FAULT	   3
#define ERRORLOG_OPENING_HANDLE	      4
#define ERRORLOG_CLOSING_HANDLE	      5
#define ERRORLOG_READING_DATA			   6
#define ERRORLOG_WRITING_DATA		      7
// Largest number of insertion strings allowed in one message
#define MAX_INSERTION_STRINGS		      20
#endif

typedef struct _DEVICE_EXTENSION
{
   SMARTCARD_EXTENSION	SmartcardExtension;
   UNICODE_STRING       DeviceName;
#ifdef USE_SYSTEM_THREAD
   PIO_WORKITEM         _PIO_WORKITEM;
   PUCHAR               pMemory_Buf;
   ULONG                uSizeOfData;
#endif
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

typedef struct _READER_EXTENSION 
{
#ifdef USE_WORK_THREAD
   
   PETHREAD             pThreadObj;	// Pointer to worker thread object
   BOOLEAN              bThreadShouldStop;// Flag set to TRUE when worker thread should quit
   PKEVENT              pevWORK_THREAD_AWAKE;
   UNICODE_STRING       uEventName;
   HANDLE               hEvent;
   PDEVICE_EXTENSION    pDeviceExtension;    //Callback pointer
   //The state of card
   bool                 uStateOfCard;
   ULONG                uReaderPowerState;
#endif   
} READER_EXTENSION, *PREADER_EXTENSION;


NTSTATUS VdCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp);
NTSTATUS VdClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp);
NTSTATUS VdCleanUp(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp);
NTSTATUS VdDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp);
NTSTATUS VdCreateDevice(IN  PDRIVER_OBJECT DriverObject);
NTSTATUS VdPowerReader(PSMARTCARD_EXTENSION SmartcardExtension);
NTSTATUS VdPowerDownReader(PSMARTCARD_EXTENSION SmartcardExtension);
NTSTATUS VdSetProtocol(PSMARTCARD_EXTENSION SmartcardExtension);
NTSTATUS VdPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp);
NTSTATUS VdPowerUpReader(PSMARTCARD_EXTENSION SmartcardExtension);
NTSTATUS VdTransmit(PSMARTCARD_EXTENSION SmartcardExtension);
NTSTATUS VdTransmitT1(PSMARTCARD_EXTENSION SmartcardExtension);
NTSTATUS VdTransmitT0(PSMARTCARD_EXTENSION SmartcardExtension);
NTSTATUS VdCardTracking(PSMARTCARD_EXTENSION SmartcardExtension);
NTSTATUS VdCancel(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp);
NTSTATUS VdTransmitRaw(PSMARTCARD_EXTENSION SmartcardExtension);
NTSTATUS VdVendorIOCTL(PSMARTCARD_EXTENSION SmartcardExtension);
void VdDriverUnload(IN PDRIVER_OBJECT DriverObject);
void VdCompleteCardTracking(IN PSMARTCARD_EXTENSION SmartcardExtension,bool bStateCard);


extern void InitializeEventLog(IN PDRIVER_OBJECT pDriverObject);
extern bool ReportEvent(IN ULONG	MessageLevel,IN NTSTATUS	ErrorCode,IN ULONG	UniqueErrorValue,
	            IN PVOID	pIoObject,IN PIRP		pIrp,IN ULONG	DumpData[],IN ULONG	DumpDataCount,
	            IN PWSTR	Strings[],IN ULONG	StringCount);

#ifdef USE_SYSTEM_THREAD
void Work_SystemThread(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context);
#endif
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
extern NTSTATUS WorkWithFile(PUCHAR pData, ULONG& uSize, bool bRead = true);
extern NTSTATUS SendCmdReader(UCHAR Request_Buffer[], ULONG Request_BufferLength,
                       UCHAR Reply_Buffer[], ULONG& Reply_BufferLength,
                       IN PDEVICE_OBJECT DeviceObject);
#ifdef USE_WORK_THREAD
extern void WorkerThreadMain(IN PVOID pContext); 
extern void KillThread(IN PDEVICE_EXTENSION pDE); 
#endif

#else
    #error Modification required for this type of OS
#endif
//----------------------------------------------------------------------------------------------
#endif // DRIVER_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -