『壹』 如何通过 WinUSB 功能访问 USB 设备
制造 USB 设备的独立硬件供应商 (IHV) 必须经常为应用程序提供访问设备功能的途径。
在过去,这意味着使用 Windows 驱动程序模型 (WDM) 为设备实现一个功能驱动程序,
并将该驱动程序安装在设备栈中系统提供的协议驱动程序之上。
Windows 驱动程序基础 (WDF) 现在是 USB 驱动程序的首选模型。
它为 IHV 提供 3 个选项来提供访问 USB 设备的途径:
使用 WDF 用户模式驱动程序框架 (UMDF) 实现用户模式驱动程序。
使用 WDF 内核模式驱动程序框架 (KMDF) 实现内核模式驱动程序。
将 WinUsb.sys 作为设备的功能驱动程序安装,
并提供一个使用 WinUSB API <WinUsb.dll> 访问设备的应用程序。
WinUSB 在 Windows XP 上不支持 WinUSB 选择性暂停
Windows 8 USB 驱动程序堆栈体系结构
该图分别显示了 USB 2.0 和 USB 3.0 的 USB 驱动程序堆栈。
当设备附加到 xHCI 控制器时,Windows 会加载 USB 3.0 驱动程序堆栈。
USB 3.0 堆栈是 Windows 8 中的新功能。
当设备连接到 eHCI、oHCI 或 uHCI 控制器时,Windows 会加载 USB 2.0 驱动程序堆栈。
USB 2.0 驱动程序堆栈随 Windows XP Service Pack 1 (SP1) 及更高版本的 Windows 操作系统一起提供。
『贰』 内核怎么通过主设备号找驱动,次设备号找设备
在Linux内核看来,主设备号标识设备对应的驱动程序,告诉Linux内核使用哪一个驱动程序为该设备(也就是/dev下的设备文件)服务;而次设备号则用来标识具体且唯一的某个设备。
『叁』 假设linux内核中有相应设备驱动程序,内核是怎么识别它的
驱动程序属于内核的一个部分。准确的说是内核的一个组件。不包含驱动回的内核也叫做内答核,并且这也是我们常说的内核。内核要干的事情无非5件。 1,内存管理 2,虚拟文件系统 3,进程调度 4,网络接口 5,进程间通信 驱动更像是内核的扩展组件来帮助内核实现硬件的连接和操控。内核通过提供统一的驱动操作接口供用户层使用,驱动就是在这层统一的接口下实现硬件的操控的中间层。
『肆』 windows怎么进入内核模式
内核模式操作的一种高特权模式,其中的程序代码能直接访问所有内存(包括所有的用户模式进程和应用程序的地址空间)和硬件。也称为“管理员模式”、“保护模式”或“Ring 0”。 如果再细致地对此进行分类:它又可以被分为单内核模式和微内核模式两种。单内核模式代码结构紧凑、执行速度快,但是缺乏层次;微内核正好相反。单内核模式的代表如Linux;微内核模式的代表如Windows用户模式与内核模式是如何交互的呢 当用户模式程序需要读取设备数据时,它就调用Win32 API函数,如ReadFile。Win32子系统模块(如KERNEL32.DLL)通过调用平台相关的系统服务接口实现该API,而平台相关的系统服务将调用内核模式支持例程。在ReadFile调用中,调用首先到达系统DLL(NTDLL.DLL)中的一个入口点,NtReadFile函数。然后这个用户模式的NtReadFile函数接着调用系统服务接口,最后由系统服务接口调用内核模式中的服务例程,该例程同样名为NtReadFile。系统中还有许多与NtReadFile相似的服务例程,它们同样运行在内核模式中,为应用程序请求提供服务,并以某种方式与设备交互。它们首先检查传递给它们的参数以保护系统安全或防止用户模式程序非法存取数据,然后创建一个称为“I/O请求包(IRP)”的数据结构,并把这个数据结构送到某个驱动程序的入口点。在刚才的ReadFile调用中,NtReadFile将创建一个主功能代码为IRP_MJ_READ(DDK头文件中的一个常量)的IRP。实际的处理细节可能会有不同,但对于NtReadFile例程,可能的结果是,用户模式调用者得到一个返回值,表明该IRP代表的操作还没有完成。用户模式程序也许会继续其它工作然后等待操作完成,或者立即进入等待状态。不论哪种方式,设备驱动程序对该IRP的处理都与应用程序无关。驱动程序完成一个I/O操作后,通过调用一个特殊的内核模式服务例程来完成该IRP。完成操作是处理IRP的最后动作,它使等待的应用程序恢复运行。
『伍』 linux内核怎么访问设备节点
设备节复点代表是每个机算机硬件,制那个软件要用那个硬件,它就会打开那设备节点嘛。。。 /dev/ttyS0这个是串口0 也就是windows 里面的com1 ,只有要用到串口0的程序才会打开这个设备节点。 个人愚见,仅供参考,望及时采纳
『陆』 linux下,内核没有编译NOR Flash驱动,可以直接访问设备吗
不能访问NOR FLASH设备啊,其他的有驱动当然可以,我每次都没有编译这个驱动的,搞嵌入式才需要
『柒』 在linux 内核中,系统怎样知道设备功能的!!!
这是驱动需要做的事情,一个设备驱动模块首先初始化的时候会将自己的一些硬版件功能权注册给内核,比如probe(探测函数,就行一些基本检查和寄存器配置),susbend(硬件被挂起时需要做什么操作),resume(硬件恢复工作时要做什么操作)。所谓注册就是通过一个注册函数,将这些函数指针放入一个内核可以触及的结构体中,这样内核就可以操作这些函数了。上面的属于platform(平台)结构的函数。剩下的就是功能函数,由于设备不同,所以具体函数的功能肯定也是不同的。具体分字符设备,块设备,网络设备。这些功能函数有一些成为API留给用户调用,而有一些是只有驱动内部才能使用,用户是触及不到的。比如dma驱动,其中会有请求功能,增加任务,开始传输,传输中止等函数,如果其他的设备需要用到dma就调用这些函数接口就可以了,所以所谓的内核可以知道具体设备的具体功能,大多是指这些功能函数的接口可以直接被内核所调用,无论是静态函数注册还是直接写成外部函数。
『捌』 无法打开内核设备
1.尝试使用此命令:net start vmx86
2.查看下%systemroot%\system32\drivers\vmx86.sys 此文件是否存在?
3.如果以上两个步骤出错 尝试从新安装vmx86驱动内:步骤如下:首先容开一个CMD进入vmware安装目录使用 "vnetlib -- install vmx86"命令安装vmx86驱动,然后重启机器,在试一下。如果直接install有错,可以先用"vnetlib -- uninstall vmx86"卸载vmx86然后在从新安装注册此驱动。
『玖』 在Linux系统中以什么方式访问设备
内核加载是以模块形式,接口程序是以文件形式访问
一楼的你用的定VPC虚拟机,VPC装不了rf6,装的时候没有鼠标,走不下去。还VBOX或VMWARE
『拾』 如何从内核模式设备驱动程序中打开文件以及如何读取或写入文件
对象名称来引用文件
内核模式设备驱动程序引用到一个文件及其对象的名称。此名称是与该文件的完整路径一起 /DosDevices。例如对于 C:/Windows/Example.txt 文件的对象名称是 /DosDevices/C:/Windows/Example.txt。然后通过调用 InitializeObjectAttributes 函数的为 OBJECT_ATTRIBUTES 结构封装为对象的名称。
注意如果早期加载的设备驱动程序,不可能还存在 /DosDevices 命名空间。因此,/DosDevices 命名空间是设备驱动程序将无法访问,因为没有驱动器号公开的。仅可保证在文件系统的部分是 /SystemRoot 的命名空间。/SystemRoot 命名空间映射到操作系统安装位置文件夹。例如对于此文件夹可能是 C:/Windows 或 D:/Winnt。
下面的代码示例阐释了如何通过其对象名称来引用到一个文件
UNICODE_STRING uniName;
OBJECT_ATTRIBUTES objAttr;
RtlInitUnicodeString(&uniName, L"//DosDevices//C://WINDOWS//example.txt"); // or L"//SystemRoot//example.txt"
InitializeObjectAttributes(&objAttr, &uniName,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL, NULL);
回到顶端
获取文件句柄
若要获取文件句柄,您可以将一个 OBJECT_ATTRIBUTES 结构传递给 ZwCreateFile 函数。可以 GENERIC_READ、 GENERIC_WRITE,或 GENERIC_ALL,设置 DesiredAccess 参数,具体取决于要执行的内容。如果将 CreateOptions 参数设置为 FILE_SYNCHRONOUS_IO_NONALERT 或 FILE_SYNCHRONOUS_IO_ALERT,文件系统跟踪的当前文件位置偏移量。因此,您可以按顺序读取或写入的文件更高版本。此外,您可以访问随机位置上的文件。
下面的代码示例阐释了如何获取文件句柄
HANDLE handle;
NTSTATUS ntstatus;
IO_STATUS_BLOCK ioStatusBlock;
// Do not try to perform any file operations at higher IRQL levels.
// Instead, you may use a work item or a system worker thread to perform file operations.
if(KeGetCurrentIrql() != PASSIVE_LEVEL)
return STATUS_INVALID_DEVICE_STATE;
ntstatus = ZwCreateFile(&handle,
GENERIC_WRITE,
&objAttr, &ioStatusBlock, NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OVERWRITE_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL, 0);
回到顶端
读取或写入到文件
您现在可以调用 ZwReadFile 函数或 ZwWriteFile 函数。完成修改文件后,请使用 ZwClose 函数来关闭该句柄。
下面的代码示例阐释了如何向文件写入
#define BUFFER_SIZE 30
CHAR buffer[BUFFER_SIZE];
size_t cb;
if(NT_SUCCESS(ntstatus)) {
ntstatus = RtlStringCbPrintfA(buffer, sizeof(buffer), "This is %d test/r/n", 0x0);
if(NT_SUCCESS(ntstatus)) {
ntstatus = RtlStringCbLengthA(buffer, sizeof(buffer), &cb);
if(NT_SUCCESS(ntstatus)) {
ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock,
buffer, cb, NULL, NULL);
}
}
ZwClose(handle);
}
下面的代码示例阐释了如何从文件中读取
LARGE_INTEGER byteOffset;
ntstatus = ZwCreateFile(&handle,
GENERIC_READ,
&objAttr, &ioStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OPEN,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL, 0);
if(NT_SUCCESS(ntstatus)) {
byteOffset.LowPart = byteOffset.HighPart = 0;
ntstatus = ZwReadFile(handle, NULL, NULL, NULL, &ioStatusBlock,
buffer, BUFFER_SIZE, &byteOffset, NULL);
if(NT_SUCCESS(ntstatus)) {
buffer[BUFFER_SIZE-1] = '/0';
DbgPrint("%s/n", buffer);
}
ZwClose(handle);
}