-
-
[分享]64位驱动取当前进程的全路径
-
发表于:
2011-12-25 05:33
7751
-
#if DBG
#define dprintf DbgPrint
#else
#define dprintf
#endif
PCWSTR GetCurrentProcessPathName(void)
{
UNICODE_STRING imagName={0};
RTL_OSVERSIONINFOW os={0};
ULONG_PTR uProcessPtr;
ULONG_PTR uImagNameAddr=NULL ;
ULONG uPebOffset=0;
ULONG uParamOffset=0x10;
ULONG uImagNameOffset=0x3c;
RtlGetVersion (&os);
dprintf ("MajorVer=%d\tMinorVer=%d\tBuildNumber=%d\r\n",
os.dwMajorVersion,os.dwMinorVersion,os.dwBuildNumber);
if(KeGetCurrentIrql() != PASSIVE_LEVEL)
return NULL;
if(os.dwMajorVersion==5)
{
switch(os.dwMinorVersion)
{
case 1://xp sp3
uPebOffset=0x1b0;
break;
case 2://2003 sp2
uPebOffset=0x1a0;
break;
}
}
else if(os.dwMajorVersion==6)
{
switch(os.dwMinorVersion)
{
case 0://2008
break;
case 1:
#ifdef _AMD64_
//win7x64 sp1, 2008R2x64 sp1
uPebOffset=0x338;
uParamOffset =0x20;
uImagNameOffset=0x68;
#else
//win7x32 sp1
uPebOffset=0x1a8;
#endif
}
}
if(uPebOffset==0)
{
dprintf ("this function do not supported current os.\r\n");
return NULL ;
}
uProcessPtr =(ULONG_PTR)PsGetCurrentProcess();
uImagNameAddr=(uProcessPtr+uPebOffset);
if((uImagNameAddr =*(ULONG_PTR*)uImagNameAddr)==0)return NULL ;
uImagNameAddr+=uParamOffset;
if((uImagNameAddr =*(ULONG_PTR*)uImagNameAddr)==0)return NULL;
uImagNameAddr+=uImagNameOffset;
if((uImagNameAddr =*(ULONG_PTR*)uImagNameAddr)==0)return NULL ;
dprintf ("Process full path name: %ws\r\n",(PCWSTR)uImagNameAddr );
return (PCWSTR)uImagNameAddr;
}
//64位只在win2008 R2 sp1 下测试
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课