C++获取进程启动参数

来源:互联网 发布:淘宝联盟qq群推广 编辑:程序博客网 时间:2024/05/01 14:12
#include "stdafx.h"#include <Windows.h>#include <stdio.h>#define ProcessBasicInformation 0typedef struct{USHORT Length;USHORT MaximumLength;PWSTR  Buffer;} UNICODE_STRING, *PUNICODE_STRING;typedef struct{ULONG          AllocationSize;ULONG          ActualSize;ULONG          Flags;ULONG          Unknown1;UNICODE_STRING Unknown2;HANDLE         InputHandle;HANDLE         OutputHandle;HANDLE         ErrorHandle;UNICODE_STRING CurrentDirectory;HANDLE         CurrentDirectoryHandle;UNICODE_STRING SearchPaths;UNICODE_STRING ApplicationName;UNICODE_STRING CommandLine;PVOID          EnvironmentBlock;ULONG          Unknown[9];UNICODE_STRING Unknown3;UNICODE_STRING Unknown4;UNICODE_STRING Unknown5;UNICODE_STRING Unknown6;} PROCESS_PARAMETERS, *PPROCESS_PARAMETERS;typedef struct{ULONG               AllocationSize;ULONG               Unknown1;HINSTANCE           ProcessHinstance;PVOID               ListDlls;PPROCESS_PARAMETERS ProcessParameters;ULONG               Unknown2;HANDLE              Heap;} PEB, *PPEB;typedef struct{DWORD ExitStatus;PPEB  PebBaseAddress;DWORD AffinityMask;DWORD BasePriority;ULONG UniqueProcessId;ULONG InheritedFromUniqueProcessId;}   PROCESS_BASIC_INFORMATION;typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);PROCNTQSIP NtQueryInformationProcess;BOOL GetProcessCmdLine(DWORD dwPId,__out LPTSTR lpString){HANDLE                    hProcess;PROCESS_BASIC_INFORMATION pbi;PEB                       Peb;PROCESS_PARAMETERS        ProcParam;DWORD                     dwDummy;DWORD                     dwSize;LPVOID                    lpAddress;BOOL RetValue = FALSE;//得到进程句柄hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,dwPId);if (!hProcess)goto Ret;//获取信息if (0!=NtQueryInformationProcess(hProcess,0,(PVOID)&pbi,sizeof(PROCESS_BASIC_INFORMATION),NULL))goto Ret;if (!ReadProcessMemory(hProcess,pbi.PebBaseAddress,&Peb,sizeof(PEB),&dwDummy))goto Ret;if (!ReadProcessMemory(hProcess,Peb.ProcessParameters,&ProcParam,sizeof(PROCESS_PARAMETERS),&dwDummy))goto Ret;lpAddress = ProcParam.CommandLine.Buffer;dwSize = ProcParam.CommandLine.Length;RetValue = ReadProcessMemory( hProcess,lpAddress,(LPVOID)lpString,dwSize,&dwDummy );Ret:if(hProcess)CloseHandle (hProcess);return RetValue;}int _tmain(int argc, _TCHAR* argv[]){NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(GetModuleHandle(_T("ntdll")),"NtQueryInformationProcess");if (!NtQueryInformationProcess){//MessageBox(0,"无法定位NtQueryInformationProcess,程序退出","启动错误",MB_ICONERROR);return -1;}TCHAR str[255] = {0};GetProcessCmdLine(2816, str);return 0;}