阅读:1843回复:8
应用程序怎么和驱动程序通信?
我装了PCI卡的驱动程序,怎么写应用程序和驱动程序通信?
前提是我不知道驱动程序的源码。 我用的是9052,购买的PLX公司提供的驱动程序的光盘。 有提供好的答案的大虾我考虑把驱动程序提供给你。 谢谢! |
|
最新喜欢:abc009... |
沙发#
发布于:2003-01-10 15:16
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2003-01-10 15:42
你倒霉了!!:D
[编辑 - 1/10/03 by shengws] |
|
|
地板#
发布于:2003-01-12 17:22
//关键在于Status = NdisMRegisterDevice(
WrapperHandle, &ntDeviceName, &win32DeviceName, my_DriverObject>MajorFunction,//&DispatchTable[0], &ControlDeviceObject, &NdisDeviceHandle ); #include <ntddk.h> #include \"prexsim.h\" #include \"mindriver.h\" #pragma hdrstop /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // NDIS_STRING ntDeviceName = { sizeof( XPASSTHRU_WDM_DEVICE_NAME_W ) - sizeof( UNICODE_NULL ), sizeof( XPASSTHRU_WDM_DEVICE_NAME_W ), XPASSTHRU_WDM_DEVICE_NAME_W }; NDIS_STRING win32DeviceName = { sizeof( XPASSTHRU_WDM_SYMBOLIC_LINK_W ) - sizeof( UNICODE_NULL ), sizeof( XPASSTHRU_WDM_SYMBOLIC_LINK_W ), XPASSTHRU_WDM_SYMBOLIC_LINK_W }; PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION +1]; PDRIVER_DISPATCH NdisFunctionTable[IRP_MJ_MAXIMUM_FUNCTION + 1]; UINT FuncIndex; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // NTSTATUS NdisWDMInitialize( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NTSTATUS Status = STATUS_SUCCESS; DbgPrint(\"============>NdisWDMInitialize is Loading...\\n\"); Status=XPassThruCreateDevice(); return Status; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Create a Device For User-mode App /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// NTSTATUS XPassThruCreateDevice(void) { NDIS_STATUS Status = NDIS_STATUS_SUCCESS; unsigned short i=0; DBGPRINT(\"=======>Enter Create Device....................\\n\"); NdisAcquireSpinLock(&GlobalLock); // syc 同步 ++MiniportCount; if (1 == MiniportCount) { ASSERT(my_ControlDeviceState != PS_DEVICE_STATE_CREATING); // while (my_ControlDeviceState != PS_DEVICE_STATE_READY) { NdisReleaseSpinLock(&GlobalLock); NdisMSleep(1); // Waiting NdisAcquireSpinLock(&GlobalLock); } my_ControlDeviceState = PS_DEVICE_STATE_CREATING; ///―――――――――――――――――――――――――――――――――――――――――――――― // ok Now Can Create Device ,Call NdisMRegisterDevice NdisReleaseSpinLock(&GlobalLock); // my_DriverObject->FastIoDispatch = NULL; for ( FuncIndex = 0; FuncIndex<=IRP_MJ_MAXIMUM_FUNCTION; FuncIndex++) { NdisFunctionTable[FuncIndex] = my_DriverObject->MajorFunction[FuncIndex]; my_DriverObject->MajorFunction[FuncIndex] = PCASIM_DefaultFunctionDispatch; } my_DriverObject->MajorFunction[IRP_MJ_CREATE] = PCASIM_DeviceCreate; my_DriverObject->MajorFunction[IRP_MJ_CLOSE] = PCASIM_DeviceClose; my_DriverObject->MajorFunction[IRP_MJ_CLEANUP] = PCASIM_DeviceCleanup; my_DriverObject->MajorFunction[IRP_MJ_WRITE] = PCASIM_DeviceWrite; my_DriverObject->MajorFunction[IRP_MJ_READ] = PCASIM_DeviceRead; my_DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = PCASIM_DeviceIoControl; my_DriverObject->DriverUnload = PacketUnload; // //for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) //{ // DispatchTable = PCASIM_DefaultFunctionDispatch;//(PDRIVER_DISPATCH )PtMyPassThruDispatch; //init DISPATCH CALL TABLE //} //RtlInitUnicodeString(&MyDeviceName,(const unsigned short *)MyDevice); //RtlInitUnicodeString(&MySymbolLinkName,(const unsigned short *)MySymbolLink); /////////////////////////////////////////////////////////////////// // Create a device object and register our dispatch handlers // /////////////////////////////////////////////////////////////////// Status = NdisMRegisterDevice( WrapperHandle, &ntDeviceName, &win32DeviceName, my_DriverObject->MajorFunction,//&DispatchTable[0], &ControlDeviceObject, &NdisDeviceHandle ); |
|
|
地下室#
发布于:2003-01-13 13:28
你的卡是干什么的?是驱动什么设备的?驱动程序会给你提供一个设备名,比如在dos里串口1为com1,linux里为/dev/ttyS0,在应用程序里你可以file=open(\"/dev/ttyS0\",...), write(file,buf,size);
我像这样你就可以在应用程序里和驱动程序通信了 |
|
5楼#
发布于:2003-01-13 14:09
如果是串口等的话,可以直接使用控件;
至于一般的驱动程序,应该使用deviceiocontrol,但前提是驱动程序必须实现定义好IOCTL,如果驱动程序源吗没提供的话,看是否提供了一个dll和一个h文件,h文件中,或许见解提供了deviceiocontrol。 |
|
6楼#
发布于:2003-01-13 21:12
如果是串口等的话,可以直接使用控件; 我来补充一下, win32用户态程序访问驱动程序一般有两种方式: 第一:是使用注册的GUID在SDK下有一组SetupDixxxx的函数可以用来 获得GUID的Information set的句柄,然后可以用CreateFile,WriteFile,ReadFile,DeviceIoControl等函数进行 操作。 第二,如果有符号连接的话可以用符号连接,比如com1就是一个 符号连接,在SDK中,你可以这样使用\\\\.\\com1 HANDLE hFile=Create(\"\\\\\\\\.\\\\com1,,,,,) \\\\\\\\.\\\\是c语言的语法 |
|
7楼#
发布于:2003-01-13 21:17
主要是配置PCIBIOS
|
|
|
8楼#
发布于:2003-01-24 17:34
谢谢楼上的各位,我的PCI卡用的是9052;
我的卡主要是用来和我的设备通信的,我的设备是125K的波特率,而计算机是9600,所以我的卡就做了一下处理。我的卡有一个类似于串口的东东和我的设备通信,驱动程序有了,但是应用程序还不能和驱动通信,特别是我要用到: 1。用到中断,因为和我的设备通信的时候会有漏收数据的情况发生,在应用程序里,我怎么处理和驱动程序的中断服务程序的关系? 2。用到PCIBAR3即PCI BASE ADDRESS 3 FOR ACCESSED TO LOCAL ADDRESSES TO LOCAL ADDRESS SPACE 1 的地址,但是在应用 程序里怎么用到? 各位大侠救命呀!让我过个好年吧!谢谢! |
|