ok100fen 发表于 2011-3-26 17:26:45

版主,这个形参与实参是什么关系?

这个函数调用:

stats = MyEnumKernelModule("\\??\\c:\\windows\\system32\\123.sys",&ModuleAddress,&ModuleSize);

实参是:\\??\\c:\\windows\\system32\\123.sys

我主要关心这个实参

但是在被调用函数里,这个参数好像没啥用,下面是被调用的函数:



NTSTATUS MyEnumKernelModule(IN CHAR* str,OUT ULONG *moduleadd,OUT ULONG *modulesie)
{
NTSTATUS status = STATUS_SUCCESS;
ULONG   n       = 0;
ULONG   i       = 0;
PSYSTEM_MODULE_INFORMATION_ENTRY   module = NULL;
PVOID   pbuftmp = NULL;
ANSI_STRING    ModuleName1,ModuleName2;


//利用11号功能枚举内核模块
status = ZwQuerySystemInformation(11, &n, 0, &n);

//申请内存
pbuftmp = ExAllocatePool(NonPagedPool, n);

//再次执行,将枚举结果放到指定的内存区域
status = ZwQuerySystemInformation(11, pbuftmp, n, NULL);

module = (PSYSTEM_MODULE_INFORMATION_ENTRY)((PULONG )pbuftmp + 1 );

//初始化字符串
RtlInitAnsiString(&ModuleName1,str);
//
n       = *((PULONG)pbuftmp );
for ( i = 0; i < n; i++ )
{
    RtlInitAnsiString(&ModuleName2,&module.ImageName);
    //DbgPrint("%d\t0x%08X 0x%08X %s\n",module.LoadOrderIndex,module.Base,module.Size,module.ImageName);

    if (RtlCompareString(&ModuleName1,&ModuleName2,TRUE) == 0)
    {
      DbgPrint("MyEnumKernelModule:%s:%0X \n",ModuleName2.Buffer,module.Base);
      *moduleadd= module.Base;
      *modulesie= module.Size;
      tlgstst = TRUE;
      break;
    }
}
ExFreePool(pbuftmp);

return status;
}

ok100fen 发表于 2011-3-26 17:28:42

\\??\\c:\\windows\\system32\\123.sys和那个str是不是同一个东西?

为什么传进来后,就没用了呢?
下面函数体根本没有对它操作?

马大哈 发表于 2011-3-27 18:31:10

RtlInitAnsiString(&ModuleName1,str);
//
这一句就已经把str的内容填充到了ModuleName1中了.

我是搜索了一下RtlInitAnsiString的作用...:D

马大哈 发表于 2011-3-27 18:31:46

参见:

http://blog.csdn.net/qinmi/archive/2007/06/22/1662271.aspx
页: [1]
查看完整版本: 版主,这个形参与实参是什么关系?