| 
			 
					阅读:1975回复:8
				 
				应用程序怎么和驱动程序通信?
					我装了PCI卡的驱动程序,怎么写应用程序和驱动程序通信?
 
							前提是我不知道驱动程序的源码。 我用的是9052,购买的PLX公司提供的驱动程序的光盘。 有提供好的答案的大虾我考虑把驱动程序提供给你。 谢谢!  | 
	|
					
						最新喜欢: | 
	
| 
			 沙发# 
								发布于: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 的地址,但是在应用 程序里怎么用到? 各位大侠救命呀!让我过个好年吧!谢谢!  | 
	|