2 class Sample public KDriver SAFEDESTRUCTORS public WDM
现代微机原理与接口技术(第 2版) 该驱动程序框架包含了几个最基本的类,这些类是: class Sample : public KDriver // 驱动程序类,用于初始化驱动程序 { SAFE_DESTRUCTORS public: // 以下成员函数注意和WDM中有关例程联系起来看 virtual NTSTATUS Driver. Entry(PUNICODE_STRING Registry. Path); virtual NTSTATUS Add. Device(PDEVICE_OBJECT Pdo); void Load. Registry. Parameters(KRegistry. Key &Params); int m_Unit; // The following data members are loaded from the registry during Driver. Entry ULONG m_b. Break. On. Entry; }; 21 http: //qsyang. yeah. net
现代微机原理与接口技术 (第 2版) class Sample. Device : public KPnp. Device // 是设备类 KDvice的派生类,用于在 WDM环境下支持即插即用设备 { // Constructors public: SAFE_DESTRUCTORS; Sample. Device(PDEVICE_OBJECT Pdo, ULONG Unit); ~Sample. Device(); // Member Functions 注意和PNP的次功能代码联系起来看 public: DEVMEMBER_DISPATCHERS virtual NTSTATUS On. Start. Device(KIrp I); virtual NTSTATUS On. Stop. Device(KIrp I); virtual NTSTATUS On. Remove. Device(KIrp I); virtual NTSTATUS Default. Pnp(KIrp I); virtual NTSTATUS Default. Power(KIrp I); virtual NTSTATUS On. Device. Power. Up(KIrp I); virtual NTSTATUS On. Device. Sleep(KIrp I); void Serial. Read(KIrp I); void Serial. Write(KIrp I); 22 http: //qsyang. yeah. net
现代微机原理与接口技术 (第 2版) NTSTATUS SAMPLE_IOCTL_Read_Handler(KIrp I); NTSTATUS SAMPLE_IOCTL_Write_Handler(KIrp I); NTSTATUS SAMPLE_IOCTL_Read. Write_Handler(KIrp I); #ifdef _COMMENT_ONLY virtual NTSTATUS Create(KIrp I); virtual NTSTATUS Close(KIrp I); virtual NTSTATUS Device. Control(KIrp I); virtual NTSTATUS System. Control(KIrp I); virtual NTSTATUS Read(KIrp I); virtual NTSTATUS Write(KIrp I); #endif // Member Data protected: // Unit number for this device (0 -9) ULONG m_Unit; KPnp. Lower. Device m_Lower; Sample. Device_Driver. Managed. Queue m_Driver. Managed. Queue; // TODO: Create additional driver managed queues. These might be // of the same class (Sample. Device_Driver. Managed. Queue), // or you might choose to derive another class. }; 23 http: //qsyang. yeah. net
现代微机原理与接口技术(第 2版) a. 使用Read和Write方式分别读写 b. Sample. Device. cpp c. d. e. f. g. void Sample. Device: : Serial. Read(KIrp I) { t << "Entering Sample. Device: : Serial. Read, " << I << EOL; NTSTATUS status = STATUS_SUCCESS; PUCHAR p. Buffer = (PUCHAR) I. Buffered. Read. Dest(); //取得 返回数据BUFF的指针 h. ULONG dw. Total. Size = I. Read. Size(CURRENT); // Requested read size i. char buff[512]; j. int n =512, j = (n % 26); k. for (int i=0; i<n; i++, j=(j + 1)%26) l. { buff[i] = 'a' + j; } m. buff[dw. Total. Size]=‘ ’; //指定串尾 n. strcpy((char *)p. Buffer, buff); o. // 把给应用程序的数据拷贝给返回BUFF p. t << “The string you will read is ”“ << buff << ”“” << EOL; // 输出调试信息 q. ULONG dw. Bytes. Read = strlen(buff); // Count of bytes read r. I. Information() = dw. Bytes. Read; // 返回给应用程序的信息的字节个数 s. I. Status() = status; t. m_Driver. Managed. Queue. Pnp. Next. Irp(I); u. } 38 http: //qsyang. yeah. net
void Sample. Device: : Serial. Write(KIrp I) 现代微机原理与接口技术(第 2版) { t << "Entering Sample. Device: : Serial. Write, " << I << EOL; NTSTATUS status = STATUS_SUCCESS; PUCHAR p. Buffer = (PUCHAR)I. Buffered. Write. Source(); //取得 存放应用程序写给驱动程序的数据的BUFF的指针 ULONG dw. Total. Size = I. Write. Size(CURRENT); // 获得应用程 序写给驱动程序的信息的字节数。 ULONG dw. Bytes. Sent = dw. Total. Size; char buff[512]; strcpy(buff, (char *)p. Buffer); // 应用程序写给驱动程序的数据在 I. Buffered. Write. Source()返回的指针中。 buff[dw. Bytes. Sent] = '