取进程的用户(所有进程)

    typedef  struct  _UNICODE_STRING {
        USHORT Length;        
        USHORT MaximumLength; 
        PWSTR  Buffer;
    } UNICODE_STRING, 
* PUNICODE_STRING;

    
// SystemProcessInformation
    typedef  struct  _SYSTEM_PROCESS_INFORMATION
    {
        DWORD            dwNextEntryOffset;
        DWORD            dwNumberOfThreads;
        LARGE_INTEGER    qSpareLi1;
        LARGE_INTEGER    qSpareLi2;
        LARGE_INTEGER    qSpareLi3;
        LARGE_INTEGER    qCreateTime;
        LARGE_INTEGER    qUserTime;
        LARGE_INTEGER    qKernelTime;
        UNICODE_STRING    ImageName;
        
int                 nBasePriority;
        DWORD            dwProcessId;
        DWORD            dwInheritedFromUniqueProcessId;
        DWORD            dwHandleCount;
        DWORD            dwSessionId;
        ULONG            dwSpareUl3;
        SIZE_T            tPeakVirtualSize;
        SIZE_T            tVirtualSize;
        DWORD            dwPageFaultCount;
        DWORD            dwPeakWorkingSetSize;
        DWORD            dwWorkingSetSize;
        SIZE_T            tQuotaPeakPagedPoolUsage;
        SIZE_T            tQuotaPagedPoolUsage;
        SIZE_T            tQuotaPeakNonPagedPoolUsage;
        SIZE_T            tQuotaNonPagedPoolUsage;
        SIZE_T            tPagefileUsage;
        SIZE_T            tPeakPagefileUsage;
        SIZE_T            tPrivatePageCount;
        LARGE_INTEGER    qReadOperationCount;
        LARGE_INTEGER    qWriteOperationCount;
        LARGE_INTEGER    qOtherOperationCount;
        LARGE_INTEGER    qReadTransferCount;
        LARGE_INTEGER    qWriteTransferCount;
        LARGE_INTEGER    qOtherTransferCount;
    }SYSTEM_PROCESS_INFORMATION;

    
#define  SystemProcessInformation        5
    
#define  SystemTimeOfDayInformation        3
    
#define  SystemHandleInformation            16

    
#define  STATUS_INFO_LENGTH_MISMATCH        ((LONG)0xC0000004L)

VOID 
* GetDllProc(CHAR  *  pDllName, CHAR  * pProcName)
{
    HMODULE        hMod;
    hMod 
=  LoadLibraryA(pDllName);
    
if (hMod  ==  NULL)
        
return  NULL;

    
return  GetProcAddress(hMod, pProcName);
}

typedef LONG (WINAPI 
* Fun_NtQuerySystemInformation) (
    
int  SystemInformationClass,
    OUT PVOID SystemInformation,
    IN ULONG SystemInformationLength,
    OUT ULONG 
*  pReturnLength OPTIONAL);

BOOL NSystem::GetSysProcInfo(SYSTEM_PROCESS_INFORMATION 
**  ppSysProcInfo)
{
    Fun_NtQuerySystemInformation    _NtQuerySystemInformation;
    _NtQuerySystemInformation 
=  (Fun_NtQuerySystemInformation)::GetDllProc( " NTDLL.DLL " " NtQuerySystemInformation " );
    
if (_NtQuerySystemInformation  ==  NULL)
        
return  FALSE;

    DWORD        dwSize 
=   1024 * 1024 ;
    VOID        
*  pBuf  =  NULL;
    LONG        lRetVal;

    
for (;;)
    {
        
if (pBuf)
            free(pBuf);
        pBuf 
=  (VOID  * )malloc(dwSize);
        lRetVal 
=  _NtQuerySystemInformation(SystemProcessInformation, 
            pBuf, dwSize, NULL);
        
if (STATUS_INFO_LENGTH_MISMATCH  !=  lRetVal)
            
break ;
        dwSize 
*=   2 ;
    }

    
if (lRetVal  ==   0 )
    {
        
* ppSysProcInfo  =  (SYSTEM_PROCESS_INFORMATION  * )pBuf;
        
return  TRUE;
    }
    free(pBuf);
    
return  FALSE;
}


typedef BYTE (WINAPI 
* Fun_WinStationGetProcessSid)(HANDLE hServer,DWORD ProcessId , FILETIME ProcessStartTime,PBYTE pProcessUserSid ,PDWORD dwSidSize);
typedef VOID (WINAPI 
* Fun_CachedGetUserFromSid)( PSID pSid , PWCHAR pUserName,PULONG cbUserName);


BOOL NSystem::GetProcessUser(DWORD dwPid, _bstr_t 
* pbStrUser)
{
    Fun_WinStationGetProcessSid        _WinStationGetProcessSid;
    Fun_CachedGetUserFromSid        _CachedGetUserFromSid;

    _WinStationGetProcessSid 
=  (Fun_WinStationGetProcessSid)
        GetDllProc(
" Winsta.dll " " WinStationGetProcessSid " );
    _CachedGetUserFromSid 
=  (Fun_CachedGetUserFromSid)
        GetDllProc(
" utildll.dll " " CachedGetUserFromSid " );

    
if (_WinStationGetProcessSid  ==  NULL  ||  _CachedGetUserFromSid  ==  NULL)
        
return  FALSE;

    BYTE        cRetVal;
    FILETIME    ftStartTime;
    DWORD        dwSize;
    BYTE        
*  pSid;
    BOOL        bRetVal, bFind;
    SYSTEM_PROCESS_INFORMATION    
*     pProcInfo,  *  pCurProcInfo;

    bRetVal 
=  GetSysProcInfo( & pProcInfo);
    
if (bRetVal  ==  FALSE  ||  pProcInfo  ==  NULL)
        
return  FALSE;

    bFind 
=  FALSE;
    pCurProcInfo 
=  pProcInfo;
    
for (;;)
    {
        
if (pCurProcInfo -> dwProcessId  ==  dwPid)
        {
            memcpy(
& ftStartTime,  & pCurProcInfo -> qCreateTime,  sizeof (ftStartTime));
            bFind 
=  TRUE;
            
break ;
        }

        
if (pCurProcInfo -> dwNextEntryOffset  ==   0 )
            
break ;
        pCurProcInfo 
=  (SYSTEM_PROCESS_INFORMATION  * )((BYTE  * )pCurProcInfo  +  
            pCurProcInfo
-> dwNextEntryOffset);
    }
    
if (bFind  ==  FALSE)
    {
        free(pProcInfo);
        
return  FALSE;
    }

    cRetVal 
=  _WinStationGetProcessSid(NULL, dwPid, ftStartTime, NULL,  & dwSize);
    
if (cRetVal  !=   0 )
        
return  FALSE;

    pSid 
=   new  BYTE[dwSize];
    cRetVal 
=  _WinStationGetProcessSid(NULL, dwPid, ftStartTime, pSid,  & dwSize);
    
if (cRetVal  ==   0 )
    {
        delete [] pSid;
        
return  FALSE;
    }

    WCHAR            szUserName[
1024 ];
    dwSize 
=   1024 ;
    _CachedGetUserFromSid(pSid, szUserName, 
& dwSize);
    delete [] pSid;
    
if (dwSize  ==   0 )
        
return  FALSE;

    
* pbStrUser  =  szUserName;
    
return  TRUE;
}

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(1)进程的调度采用优先数调度算法。 (2)采用动态优先数法确定进程的优先级别。 (3)设计三个链队列,分别用来表示运行队列、就绪队列和完成队列。 (4)用户输入进程标识符以及进程所需的时间,申请空间存放进程 PCB 信息。 优先数调度算法为每个进程设一个优先数,它总是把处理机给就绪队列中具有最高优先权的进程,常用的算法有静态优先数法和动态优先数法。 动态优先数法,使进程的优先权随时间而改变。初始的进程优先数决于进程运行所需要的时间,时间达,则优先数低。采了将进程优先数定为用一个较大的数(50)减去进程运行所需要的时间。随着进程的运行对优先数进行调整,每次运行时都是从就绪队列中选优先数最大的进程运行,所以将就绪队列按照优先数的大小从高到低排列,这样,每次队头进程即可。 进程每执行一次,优先数减一个数(自定),CPU 时间数加 1,进程还需要的时间数减 1。如果进程所需要的时间为 0,说明进程运行完毕,将其状态变为完成状态“F”,将此 PCB 插入到完成队列中,若就绪队列不空,则将就绪队列中的第一个 PCB 变为运行状态。进程若没有完成,则将其优先数和就绪队列中第一个 PCB 的优先数作比较,如果小,则将其变为就绪态,插入到就绪队列中适当的位置,将就续队列中的第一个 PCB 变为运行态投入运行,重复上述过程,直到就绪队列为空,所有进程成为完成态为止。
### 回答1: 提进程所有DLL文件的工具是一种用于获取一个正在运行的进程所加载的所有动态链接库文件的软件工具。通过使用该工具,我们可以快速、方便地获取这些DLL文件,并进行分析、调试或其他进一步的处理。 这样的工具通常具有以下功能: 1. 进程选择:可以从当前正在运行的进程列表中选择要提DLL文件的目标进程。 2. DLL文件列表:显示目标进程已加载的所有DLL文件,包括它们的名称、路径和版本信息等。 3. 提DLL文件:提供一键提目标进程加载的所有DLL文件的功能。一旦点击提按钮,工具将自动将DLL文件保存到指定的目录中。 4. 进度跟踪:显示提过程的进度,以便确定提是否正在进行中,以及何时完成。 通过使用这样的工具,我们可以更好地了解一个进程运行时所依赖的DLL文件。这对于调试过程中的问题定位、恶意软件分析和逆向工程等活动非常有用。对于开发人员和系统管理员来说,提进程所有DLL的工具也是一种有助于进行性能优化和冲突解决的实用程序。 当然,使用这样的工具需要注意保护个人隐私和合法性。确保在合法授权和合规的情况下使用该工具,以避免滥用和非法使用。 ### 回答2: 提进程所有 DLL 的工具是指一个可以帮助提指定进程运行时加载的所有动态链接库(DLL)文件的辅助工具。一些开发者和研究人员可能会使用这样的工具来分析特定进程的依赖关系、检查运行时加载的 DLL 文件以及帮助解决问题的需要。 这种工具通常会提供一个用户界面或命令行界面,能够让用户选择要检查的进程和提 DLL 文件的保存路径。它会扫描选择的进程的内存,并找到每个加载的 DLL 文件。提的 DLL 文件将被保存到指定的文件夹中,以便进一步分析。 使用这种工具可以有很多应用场景。例如,当一个进程运行异常或崩溃时,提进程所有 DLL 的工具可以帮助开发者分析问题的根本原因,查找是否存在错误的或冲突的 DLL 文件。另外,这些工具还可以用于检查一个已知进程的依赖关系,帮助开发者确定是否缺少某些必需的 DLL 文件。 总结而言,提进程所有 DLL 的工具是一种方便的辅助工具,可帮助开发者分析和处理进程相关的 DLL 文件问题。通过提并保存 DLL 文件,开发者可以更好地了解进程的运行环境,并解决与 DLL 文件相关的错误和冲突。 ### 回答3: 提进程所有DLL的工具是指能够将运行中的进程中所加载的DLL文件提出来的软件工具。这种工具的主要应用场景是在进行软件逆向工程、系统调试以及恶意软件分析等方面。 一种常用的提进程所有DLL的工具是Process Explorer。它是一款由微软提供的免费软件,可以用于监视系统上的进程活动情况。在Process Explorer中,我们可以通过选择目标进程,然后在菜单栏中点击"View" -> "Lower Pane View" -> "DLLs",即可显示该进程所加载的所有DLL文件。然后,我们可以将这些DLL文件以二进制形式导出,以供进一步分析和处理。 另外,还有一些第三方工具也可以用于提进程所有DLL。例如,有一款叫做PE-bear的工具,它是一款功能强大的二进制文件编辑器,可以用于查看和编辑PE文件(可执行文件、DLL等)。我们可以使用PE-bear打开一个进程所在的PE文件,然后在其导出目录中查找并导出所有的DLL文件。这种方式相对灵活,可以针对某个特定的进程进行DLL提,同时也能够在提过程中进行一些其他的编辑和调试操作。 总体来说,提进程所有DLL的工具有很多种,选择合适的工具决于具体的需求和场景。这些工具都可以帮助我们从运行中的进程中提所加载的DLL文件,并在进行软件逆向工程、系统调试和恶意软件分析等方面发挥关键作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值