swallow1
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2003-03-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1843回复:8

应用程序怎么和驱动程序通信?

楼主#
更多 发布于:2003-01-10 14:39
我装了PCI卡的驱动程序,怎么写应用程序和驱动程序通信?
前提是我不知道驱动程序的源码。

我用的是9052,购买的PLX公司提供的驱动程序的光盘。

有提供好的答案的大虾我考虑把驱动程序提供给你。
谢谢!

最新喜欢:

abc0099abc009...
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-01-10 15:16
用户被禁言,该主题自动屏蔽!
shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-10 15:42
你倒霉了!!:D

[编辑 -  1/10/03 by  shengws]
喂,小孩,你的小JJ露出来了!
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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
                    );
放弃瘟草,现吃李草
wangxianjun
驱动牛犊
驱动牛犊
  • 注册日期2003-01-03
  • 最后登录2003-04-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-13 13:28
你的卡是干什么的?是驱动什么设备的?驱动程序会给你提供一个设备名,比如在dos里串口1为com1,linux里为/dev/ttyS0,在应用程序里你可以file=open(\"/dev/ttyS0\",...),  write(file,buf,size);
我像这样你就可以在应用程序里和驱动程序通信了
Gong_XG
驱动太牛
驱动太牛
  • 注册日期2002-10-01
  • 最后登录2010-11-25
  • 粉丝0
  • 关注0
  • 积分313分
  • 威望46点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-13 14:09
如果是串口等的话,可以直接使用控件;
至于一般的驱动程序,应该使用deviceiocontrol,但前提是驱动程序必须实现定义好IOCTL,如果驱动程序源吗没提供的话,看是否提供了一个dll和一个h文件,h文件中,或许见解提供了deviceiocontrol。
ambercctv
驱动牛犊
驱动牛犊
  • 注册日期2002-11-19
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-13 21:12
如果是串口等的话,可以直接使用控件;
至于一般的驱动程序,应该使用deviceiocontrol,但前提是驱动程序必须实现定义好IOCTL,如果驱动程序源吗没提供的话,看是否提供了一个dll和一个h文件,h文件中,或许见解提供了deviceiocontrol。


我来补充一下, win32用户态程序访问驱动程序一般有两种方式:
第一:是使用注册的GUID在SDK下有一组SetupDixxxx的函数可以用来
获得GUID的Information set的句柄,然后可以用CreateFile,WriteFile,ReadFile,DeviceIoControl等函数进行
操作。
第二,如果有符号连接的话可以用符号连接,比如com1就是一个
符号连接,在SDK中,你可以这样使用\\\\.\\com1
HANDLE hFile=Create(\"\\\\\\\\.\\\\com1,,,,,)
\\\\\\\\.\\\\是c语言的语法
zheng2002
驱动中牛
驱动中牛
  • 注册日期2002-04-17
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-01-13 21:17
主要是配置PCIBIOS
qq:14459938 email:zheng2002@21cn.com RH9 kernel 2.4.20
swallow1
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2003-03-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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 的地址,但是在应用  程序里怎么用到?

各位大侠救命呀!让我过个好年吧!谢谢!
游客

返回顶部