阅读:1011回复:2
菜鸟的疑惑
例如大家熟悉的键盘,鼠标这些设备. 是不是都是已经约定好的.串型口哪个线的信号 电压电流 代表的什么含义. 系统已经把它们作为标准的设备. 这些设备系统是不是已经设计好了它们的驱动程序. 串型口产生中断,系统根据中断然后去调用驱动程序
第二是不是 对于上面的标准的设备,系统是不是已经定义好了上面设备的接口,用户需要调用这些设备就通过程序调用这些接口. 而驱动程序必需以实现这些接口为准 ,实现系统描述编程调用接口(API)描述的功能。 API 和这些驱动程序之间的关系 能不能用通俗的语言告诉我。 |
|
沙发#
发布于:2004-04-05 10:30
你的理解是对的。操作系统已经定义好了设备的接口,也就是API函数到驱动程序相关的操作之间的东西已经定好了。在驱动程序中,你只要具体实现定义好的函数就行了。 例如: 你必须在驱动程序中有DriverEntry,在这个函数中,你需要告诉驱动程序你自己实现的函数的名字: NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { NTSTATUS status = STATUS_SUCCESS; #if DBG DebugPrintInit("Wdm1 checked"); #else DebugPrintInit("Wdm1 free"); #endif DebugPrint("RegistryPath is %T",RegistryPath); // Export other driver entry points... DriverObject->DriverExtension->AddDevice = Wdm1AddDevice; DriverObject->DriverUnload = Wdm1Unload; DriverObject->MajorFunction[IRP_MJ_CREATE] = Wdm1Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Wdm1Close; DriverObject->MajorFunction[IRP_MJ_PNP] = Wdm1Pnp; DriverObject->MajorFunction[IRP_MJ_POWER] = Wdm1Power; DriverObject->MajorFunction[IRP_MJ_READ] = Wdm1Read; DriverObject->MajorFunction[IRP_MJ_WRITE] = Wdm1Write; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Wdm1DeviceControl; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = Wdm1SystemControl; // Initialise spin lock which protects access to shared memory buffer KeInitializeSpinLock(&BufferLock); DebugPrintMsg("DriverEntry completed"); return status; } 上面的Wdm1AddDevice,Wdm1Create等Wdm***函数就是需要你自己写的。用户的应用程序中调用函数open打开一个设备时,操作系统就调用了你自己的函数Wdm1Create。用户应用程序调用read时,操作系统就调用你自己的函数Wdm1Read. |
|
|
板凳#
发布于:2004-04-05 13:26
lingzjl:你的驱动应该不错嘛。以后多请教。
pingjingde: 应该是你说的那个样子的。实际上在VC里面操作这些都是用的 CreateFile()创建一个设备句柄。然后用DeviceIoControl()函数来控制和读写 IO 的,实际上所有的外设都是对IO口进行操作。 我刚把USB的硬件开发完了,现在写驱动很郁闷!不知道从哪里下手。这是第一次写驱动。大家多指教! |
|
|