导航
  • 主页
  • VC综合技术
  • MFC新技术
  • 互联网技术
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC++技术资源

SYS 驱动程序的一个函数,有一句不懂,求解!

xingworld 2010-07-13 08:33:55
在网上找到这段代码,是 SYS 驱动程序的一个函数,用来获取当前进程的全路径,程序运行良好。但其中有一句很迷惑,不知道什么用意,特来求解。


// 就是搞不明白这句是要判断什么?是要判断 dwAddress 指针是否有效吗?还是什么意思?为什么这么写呢?谢谢
if ( 0 == (dwAddress = *(DWORD*)dwAddress) )
{
return FALSE;
}


完整函数的代码如下:

BOOLEAN drvfunc_get_processfullname( OUT PCHAR pszFullProcessName, IN ULONG uSize )
{
BOOLEAN bRet;
NTSTATUS ntStatus;
ULONG uOsMajorVersion = 0;
ULONG uOsMinorVersion = 0;
WCHAR wszProName[ MAX_PATH ] = {0};
UNICODE_STRING szSource;
ANSI_STRING szDest;
#if AMD64
__int64 dwAddress = 0;
#else
DWORD dwAddress = 0;
#endif

if ( PASSIVE_LEVEL != KeGetCurrentIrql() )
{
return FALSE;
}

// ...
bRet = FALSE;

__try
{
ntStatus = drvfunc_get_os_version( &uOsMajorVersion, &uOsMinorVersion );
if ( NT_SUCCESS( ntStatus ) )
{
#if AMD64
dwAddress = (__int64)PsGetCurrentProcess();
#else
dwAddress = (DWORD)PsGetCurrentProcess();
#endif
if ( dwAddress > 0 && 0xFFFFFFFF != dwAddress )
{
// 目前只支持 Win 2000/xp/2003
if ( uOsMajorVersion >= 5 && uOsMinorVersion <= 2 )
{
// 取得 PEB,不同平台的位置是不同的。
if ( uOsMajorVersion == 5 && uOsMinorVersion < 2 )
{
dwAddress += BASE_PROCESS_PEB_OFFSET;
}
else
{
dwAddress += W2003_BASE_PROCESS_PEB_OFFSET;
}

if ( 0 == (dwAddress = *(DWORD*)dwAddress) )
{
return FALSE;
}

// 通过peb取得RTL_USER_PROCESS_PARAMETERS
dwAddress += BASE_PEB_PROCESS_PARAMETER_OFFSET;
if ( 0 == (dwAddress = *(DWORD*)dwAddress) )
{
return FALSE;
}

// 在 RTL_USER_PROCESS_PARAMETERS->ImagePathName 保存了路径,偏移为38,
dwAddress += BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME;
if ( (dwAddress = *(DWORD*)dwAddress) == 0 )
{
return FALSE;
}

// ..
//_snwprintf( wszProName, sizeof(wszProName)-sizeof(WCHAR), "%s", (PCWSTR)dwAddress );
szSource.Buffer = (PWSTR)dwAddress;
szSource.Length = wcslen((PWSTR)dwAddress)*sizeof(WCHAR);
RtlUnicodeStringToAnsiString( &szDest, &szSource, TRUE );

// ..
_snprintf( pszFullProcessName, uSize-sizeof(char), "%s", szDest.Buffer );
}
}
}
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
}

return TRUE;
}
...全文
58 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjf_play 2011-02-23
你这个方法能获取到了吗?我现在要获取系统进程所有的路径,我也看到了这个代码但我不能正确获取啊,希望楼主能把你的代码共享
回复
zhongpingjun 2010-07-14
围观
学习学习
回复
xingworld 2010-07-14
呵呵,仔细看看了解了,呵呵,谢谢大家
回复
annelcf 2010-07-13
因为调用PsGetCurrentProcess()会返回一个指向_EPROCESS的指针,这段代码中将这个指针直接用dwAddress保存,所以dwAddress就是一个指针。
要得到process完整路径需要利用_EPROCESS结构中的_PEB结构指针和_PEB结构中的RTL_USER_PROCESS_PARAMETERS结构指针,来找到ImagePathName 字符串的地址,所以需要将dwAddress加上对应偏移量的方法找到_PEB结构指针和RTL_USER_PROCESS_PARAMETERS结构指针的地址,用if (0 == (dwAddress = *(DWORD*)dwAddress))来得到对应结构体的存储地址并判断该地址是否有效。
回复
xiezonglin 2010-07-13
以上皆对
回复
webcq1999 2010-07-13
dwAddress 本身已经是一个指针,dwAddress = *(DWORD*)dwAddress 表示这个指针指向的地址处也是一个指针,并将其值取过来赋给 dwAddress ,然后在判断该地址是否有效( 是否为0 ).
回复
这个就是将dwAddress指向的值再赋给dwAddress,然后判断它是不是为0
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……