zhanluhua
驱动牛犊
驱动牛犊
  • 注册日期2008-08-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1080回复:1

驱动程序中函数的参数传递问题?

楼主#
更多 发布于:2008-10-19 16:25
各位前辈,我在调试一个程序的时候发现一个问题,这个代码是论坛上某牛人写的文件过滤程序,我把其中的一个函数分成两个,想重用一段代码,修改后出现了问题,先上代码我再解释:
VOID HideMe(IN PUNICODE_STRING RegistryPath)
{
    
    PWCHAR pStr = NULL;
    
        FindSystemPath(RegistryPath,pStr);//此函数执行后,pStr依然是无效值,引起内存访问错误    
        while (*pStr != L'\\')
        {
            pStr--;
        }
        AddHideObject(pStr + 1, CDO_FLAG_FILE);
        //KdPrint(("%ws", pStr + 1));
        
    
}

//获取注册表中保存该驱动程序的键值指针
VOID FindSystemPath(IN PUNICODE_STRING RegistryPath,OUT PWCHAR  pStr){//参数传递的问题
    NTSTATUS status;
    HANDLE hkey;
    OBJECT_ATTRIBUTES oa;
    ULONG size = 0;
    UNICODE_STRING valname;
    //PWCHAR pStr = NULL;
    PKEY_VALUE_PARTIAL_INFORMATION vpip;
    
    .........
    .........
    .........

        status = ZwQueryValueKey(hkey, &valname, KeyValuePartialInformation, vpip, size, &size);
        if (!NT_SUCCESS(status))
        {
            return;
        }
        //得到镜像文件的路径
        pStr = (PWCHAR)(vpip->Data + vpip->DataLength);//此时pStr 得到的是有效值
        
        ExFreePool(vpip);
        ZwClose(hkey);
    }
}
问题:

调用函数FindSystemPath(IN PUNICODE_STRING RegistryPath,OUT PWCHAR  pStr)后,pStr并未得到有效值,估计是参数传递出了问题,尝了以下解决方法均无效:

1.使用引用参数传递,试了下不成功,不知驱动程序中支不支持该种传递方式.
2.使用指向指针的指针来传递,现在还未调试成功,对我来说太复杂....(新手请包涵)
想听听前辈的的讲解,具体的错误原因及解决方法,如述有不详请随时联系我QQ:154510256

谢谢了
dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2008-10-20 08:56
这个代码的简化原型是
void int abc(int x,int y)
{
     y = x+2;
}
int main(int argc,char* argv[])
{
      int a = 1;
      int b = 2;
      abc(a,b);
      printf("a=%d,b=%d\r\n",a,b);
}
一切都是时间问题!
游客

返回顶部