zhonghong200
驱动牛犊
驱动牛犊
  • 注册日期2009-12-03
  • 最后登录2012-04-24
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望311点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1713回复:1

武安河驱动书里面的一个例子的改写,错误在哪里,我搞不明白了,谢谢!

楼主#
更多 发布于:2009-12-13 19:35



第2章的CharSample实例的功能是:一次将一个数字(0-9)转换成一个中文(零-九)。我把改成可以输入3个数字,然后对它进行转化。但是结果只是第一个转化正确,第2,3个都不正确,大家帮我看看,谢谢!

int __cdecl main(int argc, char *argv[])
{
//=== Parameterized IOCTL Example ===
//    int        nVal;
//    ULONG    dwVal;
    DWORD    Error;

    printf("Test application Test_CharSample starting...\n");

    hDevice = OpenByInterface( &ClassGuid, 0, &Error);
    if (hDevice == INVALID_HANDLE_VALUE)
    {
        printf("ERROR opening device: (%0x) returned from CreateFile\n", GetLastError());
        Exit(1);
    }
    else
    {
        printf("Device found, handle open.\n");
    }

    CHAR    bufInput[3];        // Input to device
    CHAR    bufOutput[6];    // Output from device
    ULONG    nOutput;                        // Count written to bufOutput

    printf("请输入三个数字(0-9)\n");
l0:    bufInput[0]=_getch();
    if ((bufInput[0]<'0') || (bufInput[0]>'9')) goto l0;
    _putch(bufInput[0]);
l1:    bufInput[1]=_getch();
    if ((bufInput[1]<'0') || (bufInput[1]>'9')) goto l1;
    _putch(bufInput[1]);
l2:    bufInput[2]=_getch();
    if ((bufInput[2]<'0') || (bufInput[2]>'9')) goto l2;
    _putch(bufInput[2]);

if (!DeviceIoControl(hDevice,
                         CHARSAMPLE_IOCTL_800,//
                         bufInput,
                         3,
                         bufOutput,
                         6,
                         &nOutput,
                         NULL)
       )
    {
        printf("ERROR: DeviceIoControl returns %0x.", GetLastError());
        Exit(1);
    }
    printf(":");
    _putch(bufOutput[0]);
    _putch(bufOutput[1]);
    _putch(bufOutput[2]);
    _putch(bufOutput[3]);
    _putch(bufOutput[4]);
    _putch(bufOutput[5]);
    printf("\n");
    CloseIfOpen();
    return 0;
}

NTSTATUS CharSampleDevice::DeviceControl(KIrp I) //改掉
{
    NTSTATUS status;
    CHAR n,c[]="零一二三四五六七八九";

    switch (I.IoctlCode())
    {
        case CHARSAMPLE_IOCTL_800:
            nin=I.IoctlInputBufferSize();    //要转换的数字数目,如3个数字
            cin=new (NonPagedPool) CHAR[nin];//申请一个内存,用于存放数字
            if ( cin == NULL )
            {
                return STATUS_INSUFFICIENT_RESOURCES;
            }

            nout=I.IoctlOutputBufferSize();    //输出缓冲区大小,如6个字节
            cout=new (NonPagedPool) CHAR[nout]; //申请一个内存,用于存放中文
            if ( cout == NULL )
            {
                delete cin;
                return STATUS_INSUFFICIENT_RESOURCES;
            }
        strncpy(cin,(PCHAR)I.IoctlBuffer(),nin);//将数字字符拷贝到cin中 逐个转化
        for(int i=0;i<3;i++)
        {
            strncpy((PCHAR)I.IoctlBuffer(),cin,1);//将cin缓冲区的值赋值到IoctlBuffer
            n=*(CHAR *)I.IoctlBuffer();//输入n=应用程序传给驱动程序的数字ASCII码
            if ((n >= '0') && (n <= '9'))
            {        //若为数字,则处理
            n -= '0'; //n=数字(0-9)
            strncpy((PCHAR)I.IoctlBuffer(),&c[n*2],2);
            strncpy(cout,(PCHAR)I.IoctlBuffer(),2);    //将转换后的中文字符拷贝到cout中
            cin++;
            cout += 2;    //调整cout指针,+2是因为一个中文占2个字节空间
            }
        }
        cout -= nout;    //调整cout指针,指向缓冲区的头
        strncpy((PCHAR)I.IoctlBuffer(),cout,nout);     //将转换后的全部中文字符拷贝到应用程序的缓冲区
        I.Information() = nout;
        if (cout) delete cout;    //删除cout
        //cin -= (nout - 2)/2;     //调整cin指针,指向缓冲区的头=
        cin=cin-nin;
        if (cin) delete cin;     //删除cin
        status = STATUS_SUCCESS;
        default:
            // Unrecognized IOCTL request
            status = STATUS_INVALID_PARAMETER;
            break;
    }

    return I.PnpComplete(this, status);
}
orangeam
驱动牛犊
驱动牛犊
  • 注册日期2009-12-01
  • 最后登录2011-04-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望81点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-12-18 11:53
回 楼主(zhonghong200) 的帖子
        for(int i=0;i<3;i++)
        {
            strncpy((PCHAR)I.IoctlBuffer(),cin,1);//将cin缓冲区的值赋值到IoctlBuffer
            n=*(CHAR *)I.IoctlBuffer();//输入n=应用程序传给驱动程序的数字ASCII码
            if ((n >= '0') && (n <= '9'))
            {        //若为数字,则处理
            n -= '0'; //n=数字(0-9)
            strncpy((PCHAR)I.IoctlBuffer(),&c[n*2],2);
            strncpy(cout,(PCHAR)I.IoctlBuffer(),2);    //将转换后的中文字符拷贝到cout中
            cin++;
            cout += 2;    //调整cout指针,+2是因为一个中文占2个字节空间
            }
        }

在这个for循环里面之用cin和cout,也不知道你用I.IoctlBuffer()干嘛,
for完了之后不是有strncpy((PCHAR)I.IoctlBuffer(),cout,nout) 吗?程序结构不清晰,不简洁。所以,实在让人懒得看下去
游客

返回顶部