版主,这个形参与实参是什么关系?
这个函数调用: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;
}
\\??\\c:\\windows\\system32\\123.sys和那个str是不是同一个东西?
为什么传进来后,就没用了呢?
下面函数体根本没有对它操作? RtlInitAnsiString(&ModuleName1,str);
//
这一句就已经把str的内容填充到了ModuleName1中了.
我是搜索了一下RtlInitAnsiString的作用...:D 参见:
http://blog.csdn.net/qinmi/archive/2007/06/22/1662271.aspx
页:
[1]