pingjingde
驱动牛犊
驱动牛犊
  • 注册日期2003-03-05
  • 最后登录2004-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1011回复:2

菜鸟的疑惑

楼主#
更多 发布于:2004-04-04 08:22
例如大家熟悉的键盘,鼠标这些设备. 是不是都是已经约定好的.串型口哪个线的信号 电压电流 代表的什么含义.  系统已经把它们作为标准的设备. 这些设备系统是不是已经设计好了它们的驱动程序. 串型口产生中断,系统根据中断然后去调用驱动程序
  
  第二是不是  对于上面的标准的设备,系统是不是已经定义好了上面设备的接口,用户需要调用这些设备就通过程序调用这些接口.  而驱动程序必需以实现这些接口为准 ,实现系统描述编程调用接口(API)描述的功能。

API 和这些驱动程序之间的关系 能不能用通俗的语言告诉我。
lingzjl
驱动牛犊
驱动牛犊
  • 注册日期2001-10-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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.
超级肥雀
author22
驱动小牛
驱动小牛
  • 注册日期2003-08-20
  • 最后登录2018-04-07
  • 粉丝0
  • 关注0
  • 积分391分
  • 威望85点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-05 13:26
lingzjl:你的驱动应该不错嘛。以后多请教。
pingjingde: 应该是你说的那个样子的。实际上在VC里面操作这些都是用的 CreateFile()创建一个设备句柄。然后用DeviceIoControl()函数来控制和读写 IO 的,实际上所有的外设都是对IO口进行操作。

我刚把USB的硬件开发完了,现在写驱动很郁闷!不知道从哪里下手。这是第一次写驱动。大家多指教!
我的Vc代码仓库:[url]http://sh.b211.net[/url]
游客

返回顶部