mirror of
https://github.com/reactos/reactos.git
synced 2025-07-23 15:33:46 +00:00
1. don't allow the ProcessImageFileName information class for NtSetInformationProcess() anymore
2. implemented the ProcessImageFileName class for NtQueryInformationProcess 3. changed NtCreateProcess to obtain the file name of the loaded image svn path=/trunk/; revision=11768
This commit is contained in:
parent
19f47c9b4f
commit
ad45691d40
5 changed files with 185 additions and 101 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: create.c,v 1.88 2004/11/07 15:58:41 blight Exp $
|
/* $Id: create.c,v 1.89 2004/11/21 21:09:42 weiden Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
|
@ -765,7 +765,6 @@ CreateProcessW
|
||||||
UNICODE_STRING CommandLine_U;
|
UNICODE_STRING CommandLine_U;
|
||||||
CSRSS_API_REQUEST CsrRequest;
|
CSRSS_API_REQUEST CsrRequest;
|
||||||
CSRSS_API_REPLY CsrReply;
|
CSRSS_API_REPLY CsrReply;
|
||||||
CHAR ImageFileName[8];
|
|
||||||
PWCHAR s, e;
|
PWCHAR s, e;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
UNICODE_STRING CurrentDirectory_U;
|
UNICODE_STRING CurrentDirectory_U;
|
||||||
|
@ -780,6 +779,10 @@ CreateProcessW
|
||||||
WCHAR Name[MAX_PATH];
|
WCHAR Name[MAX_PATH];
|
||||||
WCHAR *TidyCmdLine;
|
WCHAR *TidyCmdLine;
|
||||||
BOOL IsBatchFile = FALSE;
|
BOOL IsBatchFile = FALSE;
|
||||||
|
PROCESS_PRIORITY_CLASS PriorityClass;
|
||||||
|
OBJECT_ATTRIBUTES ProcObjectAttributes;
|
||||||
|
ULONG ProcAttributes = 0;
|
||||||
|
PVOID ProcSecurity = NULL;
|
||||||
|
|
||||||
DPRINT("CreateProcessW(lpApplicationName '%S', lpCommandLine '%S')\n",
|
DPRINT("CreateProcessW(lpApplicationName '%S', lpCommandLine '%S')\n",
|
||||||
lpApplicationName, lpCommandLine);
|
lpApplicationName, lpCommandLine);
|
||||||
|
@ -877,23 +880,6 @@ CreateProcessW
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Store the image file name for the process
|
|
||||||
*/
|
|
||||||
e = wcschr(s, L'.');
|
|
||||||
if (e != NULL)
|
|
||||||
{
|
|
||||||
*e = 0;
|
|
||||||
}
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
ImageFileName[i] = (CHAR)(s[i]);
|
|
||||||
}
|
|
||||||
if (e != NULL)
|
|
||||||
{
|
|
||||||
*e = '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process the application name and command line
|
* Process the application name and command line
|
||||||
*/
|
*/
|
||||||
|
@ -1012,17 +998,80 @@ CreateProcessW
|
||||||
lpProcessInformation);
|
lpProcessInformation);
|
||||||
}
|
}
|
||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
* Initialize the process object attributes
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(lpProcessAttributes != NULL)
|
||||||
|
{
|
||||||
|
if(lpProcessAttributes->bInheritHandle)
|
||||||
|
{
|
||||||
|
ProcAttributes |= OBJ_INHERIT;
|
||||||
|
}
|
||||||
|
ProcSecurity = lpProcessAttributes->lpSecurityDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
InitializeObjectAttributes(&ProcObjectAttributes,
|
||||||
|
NULL,
|
||||||
|
ProcAttributes,
|
||||||
|
NULL,
|
||||||
|
ProcSecurity);
|
||||||
|
/*
|
||||||
|
* initialize the process priority class structure
|
||||||
|
*/
|
||||||
|
PriorityClass.Foreground = FALSE;
|
||||||
|
|
||||||
|
if(dwCreationFlags & IDLE_PRIORITY_CLASS)
|
||||||
|
{
|
||||||
|
PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_IDLE;
|
||||||
|
}
|
||||||
|
else if(dwCreationFlags & BELOW_NORMAL_PRIORITY_CLASS)
|
||||||
|
{
|
||||||
|
PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_BELOW_NORMAL;
|
||||||
|
}
|
||||||
|
else if(dwCreationFlags & NORMAL_PRIORITY_CLASS)
|
||||||
|
{
|
||||||
|
PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_NORMAL;
|
||||||
|
}
|
||||||
|
else if(dwCreationFlags & ABOVE_NORMAL_PRIORITY_CLASS)
|
||||||
|
{
|
||||||
|
PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_ABOVE_NORMAL;
|
||||||
|
}
|
||||||
|
else if(dwCreationFlags & HIGH_PRIORITY_CLASS)
|
||||||
|
{
|
||||||
|
PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_HIGH;
|
||||||
|
}
|
||||||
|
else if(dwCreationFlags & REALTIME_PRIORITY_CLASS)
|
||||||
|
{
|
||||||
|
/* FIXME - This is a privileged operation. If we don't have the privilege we should
|
||||||
|
rather use PROCESS_PRIORITY_CLASS_HIGH. */
|
||||||
|
PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_REALTIME;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* FIXME - what to do in this case? */
|
||||||
|
PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a new process
|
* Create a new process
|
||||||
*/
|
*/
|
||||||
Status = NtCreateProcess(&hProcess,
|
Status = NtCreateProcess(&hProcess,
|
||||||
PROCESS_ALL_ACCESS,
|
PROCESS_ALL_ACCESS,
|
||||||
NULL,
|
&ProcObjectAttributes,
|
||||||
NtCurrentProcess(),
|
NtCurrentProcess(),
|
||||||
bInheritHandles,
|
bInheritHandles,
|
||||||
hSection,
|
hSection,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
/* FIXME - handle failure!!!!! */
|
||||||
|
|
||||||
|
Status = NtSetInformationProcess(hProcess,
|
||||||
|
ProcessPriorityClass,
|
||||||
|
&PriorityClass,
|
||||||
|
sizeof(PROCESS_PRIORITY_CLASS));
|
||||||
|
/* FIXME - handle failure!!!!! */
|
||||||
|
|
||||||
if (lpStartupInfo)
|
if (lpStartupInfo)
|
||||||
{
|
{
|
||||||
if (lpStartupInfo->lpReserved2)
|
if (lpStartupInfo->lpReserved2)
|
||||||
|
@ -1069,6 +1118,7 @@ CreateProcessW
|
||||||
0,
|
0,
|
||||||
TRUE,
|
TRUE,
|
||||||
DUPLICATE_SAME_ACCESS);
|
DUPLICATE_SAME_ACCESS);
|
||||||
|
/* FIXME - handle failure!!!!! */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1079,6 +1129,8 @@ CreateProcessW
|
||||||
&Sii,
|
&Sii,
|
||||||
sizeof(Sii),
|
sizeof(Sii),
|
||||||
&i);
|
&i);
|
||||||
|
/* FIXME - handle failure!!!!! */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Close the section
|
* Close the section
|
||||||
*/
|
*/
|
||||||
|
@ -1317,10 +1369,6 @@ CreateProcessW
|
||||||
|
|
||||||
RtlDestroyProcessParameters (Ppb);
|
RtlDestroyProcessParameters (Ppb);
|
||||||
|
|
||||||
Status = NtSetInformationProcess(hProcess,
|
|
||||||
ProcessImageFileName,
|
|
||||||
ImageFileName,
|
|
||||||
8);
|
|
||||||
/*
|
/*
|
||||||
* Create the thread for the kernel
|
* Create the thread for the kernel
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: startup.c,v 1.58 2004/10/05 10:38:57 ekohl Exp $
|
/* $Id: startup.c,v 1.59 2004/11/21 21:09:42 weiden Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -263,7 +263,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
PEDosHeader->e_lfanew == 0L ||
|
PEDosHeader->e_lfanew == 0L ||
|
||||||
*(PULONG)((PUCHAR)ImageBase + PEDosHeader->e_lfanew) != IMAGE_PE_MAGIC)
|
*(PULONG)((PUCHAR)ImageBase + PEDosHeader->e_lfanew) != IMAGE_PE_MAGIC)
|
||||||
{
|
{
|
||||||
DbgPrint("Image has bad header\n");
|
DPRINT1("Image has bad header\n");
|
||||||
ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
|
ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,7 +289,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
NULL);
|
NULL);
|
||||||
if (Peb->ProcessHeap == 0)
|
if (Peb->ProcessHeap == 0)
|
||||||
{
|
{
|
||||||
DbgPrint("Failed to create process heap\n");
|
DPRINT1("Failed to create process heap\n");
|
||||||
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,7 +322,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
sizeof(PEB_LDR_DATA));
|
sizeof(PEB_LDR_DATA));
|
||||||
if (Peb->Ldr == NULL)
|
if (Peb->Ldr == NULL)
|
||||||
{
|
{
|
||||||
DbgPrint("Failed to create loader data\n");
|
DPRINT1("Failed to create loader data\n");
|
||||||
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
Peb->Ldr->Length = sizeof(PEB_LDR_DATA);
|
Peb->Ldr->Length = sizeof(PEB_LDR_DATA);
|
||||||
|
@ -348,7 +348,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
sizeof(LDR_MODULE));
|
sizeof(LDR_MODULE));
|
||||||
if (NtModule == NULL)
|
if (NtModule == NULL)
|
||||||
{
|
{
|
||||||
DbgPrint("Failed to create loader module entry (NTDLL)\n");
|
DPRINT1("Failed to create loader module entry (NTDLL)\n");
|
||||||
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
memset(NtModule, 0, sizeof(LDR_MODULE));
|
memset(NtModule, 0, sizeof(LDR_MODULE));
|
||||||
|
@ -387,7 +387,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
sizeof(LDR_MODULE));
|
sizeof(LDR_MODULE));
|
||||||
if (ExeModule == NULL)
|
if (ExeModule == NULL)
|
||||||
{
|
{
|
||||||
DbgPrint("Failed to create loader module infomation\n");
|
DPRINT1("Failed to create loader module infomation\n");
|
||||||
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
ExeModule->BaseAddress = Peb->ImageBaseAddress;
|
ExeModule->BaseAddress = Peb->ImageBaseAddress;
|
||||||
|
@ -395,7 +395,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
if ((Peb->ProcessParameters == NULL) ||
|
if ((Peb->ProcessParameters == NULL) ||
|
||||||
(Peb->ProcessParameters->ImagePathName.Length == 0))
|
(Peb->ProcessParameters->ImagePathName.Length == 0))
|
||||||
{
|
{
|
||||||
DbgPrint("Failed to access the process parameter block\n");
|
DPRINT1("Failed to access the process parameter block\n");
|
||||||
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,7 +438,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
/* Check before returning that we can run the image safely. */
|
/* Check before returning that we can run the image safely. */
|
||||||
if (EntryPoint == NULL)
|
if (EntryPoint == NULL)
|
||||||
{
|
{
|
||||||
DbgPrint("Failed to initialize image\n");
|
DPRINT1("Failed to initialize image\n");
|
||||||
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: process.c,v 1.36 2004/11/19 01:30:35 weiden Exp $
|
/* $Id: process.c,v 1.37 2004/11/21 21:09:42 weiden Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
|
@ -49,19 +49,16 @@ static NTSTATUS RtlpCreateFirstThread
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
RtlpMapFile(PRTL_USER_PROCESS_PARAMETERS Ppb,
|
RtlpMapFile(PUNICODE_STRING ImageFileName,
|
||||||
|
PRTL_USER_PROCESS_PARAMETERS Ppb,
|
||||||
ULONG Attributes,
|
ULONG Attributes,
|
||||||
PHANDLE Section,
|
PHANDLE Section)
|
||||||
PCHAR ImageFileName)
|
|
||||||
{
|
{
|
||||||
HANDLE hFile;
|
HANDLE hFile;
|
||||||
IO_STATUS_BLOCK IoStatusBlock;
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
|
PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PWCHAR s;
|
|
||||||
PWCHAR e;
|
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
hFile = NULL;
|
hFile = NULL;
|
||||||
|
|
||||||
|
@ -70,41 +67,13 @@ RtlpMapFile(PRTL_USER_PROCESS_PARAMETERS Ppb,
|
||||||
// DbgPrint("ImagePathName %x\n", Ppb->ImagePathName.Buffer);
|
// DbgPrint("ImagePathName %x\n", Ppb->ImagePathName.Buffer);
|
||||||
|
|
||||||
InitializeObjectAttributes(&ObjectAttributes,
|
InitializeObjectAttributes(&ObjectAttributes,
|
||||||
&(Ppb->ImagePathName),
|
ImageFileName,
|
||||||
Attributes & (OBJ_CASE_INSENSITIVE | OBJ_INHERIT),
|
Attributes & (OBJ_CASE_INSENSITIVE | OBJ_INHERIT),
|
||||||
NULL,
|
NULL,
|
||||||
SecurityDescriptor);
|
SecurityDescriptor);
|
||||||
|
|
||||||
RtlNormalizeProcessParams (Ppb);
|
RtlNormalizeProcessParams (Ppb);
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
// DbgPrint("ImagePathName %x\n", Ppb->ImagePathName.Buffer);
|
|
||||||
// DbgPrint("ImagePathName %S\n", Ppb->ImagePathName.Buffer);
|
|
||||||
s = wcsrchr(Ppb->ImagePathName.Buffer, '\\');
|
|
||||||
if (s == NULL)
|
|
||||||
{
|
|
||||||
s = Ppb->ImagePathName.Buffer;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
e = wcschr(s, '.');
|
|
||||||
if (e != NULL)
|
|
||||||
{
|
|
||||||
*e = 0;
|
|
||||||
}
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
ImageFileName[i] = (CHAR)(s[i]);
|
|
||||||
}
|
|
||||||
if (e != NULL)
|
|
||||||
{
|
|
||||||
*e = '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Try to open the executable
|
* Try to open the executable
|
||||||
*/
|
*/
|
||||||
|
@ -264,17 +233,16 @@ RtlCreateUserProcess(PUNICODE_STRING ImageFileName,
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PROCESS_BASIC_INFORMATION ProcessBasicInfo;
|
PROCESS_BASIC_INFORMATION ProcessBasicInfo;
|
||||||
ULONG retlen;
|
ULONG retlen;
|
||||||
CHAR FileName[8];
|
|
||||||
SECTION_IMAGE_INFORMATION Sii;
|
SECTION_IMAGE_INFORMATION Sii;
|
||||||
ULONG ResultLength;
|
ULONG ResultLength;
|
||||||
PVOID ImageBaseAddress;
|
PVOID ImageBaseAddress;
|
||||||
|
|
||||||
DPRINT("RtlCreateUserProcess\n");
|
DPRINT("RtlCreateUserProcess\n");
|
||||||
|
|
||||||
Status = RtlpMapFile(ProcessParameters,
|
Status = RtlpMapFile(ImageFileName,
|
||||||
|
ProcessParameters,
|
||||||
Attributes,
|
Attributes,
|
||||||
&hSection,
|
&hSection);
|
||||||
FileName);
|
|
||||||
if( !NT_SUCCESS( Status ) )
|
if( !NT_SUCCESS( Status ) )
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
|
@ -310,11 +278,6 @@ RtlCreateUserProcess(PUNICODE_STRING ImageFileName,
|
||||||
ProcessBasicInfo.UniqueProcessId);
|
ProcessBasicInfo.UniqueProcessId);
|
||||||
ProcessInfo->ClientId.UniqueProcess = (HANDLE)ProcessBasicInfo.UniqueProcessId;
|
ProcessInfo->ClientId.UniqueProcess = (HANDLE)ProcessBasicInfo.UniqueProcessId;
|
||||||
|
|
||||||
Status = NtSetInformationProcess(ProcessInfo->ProcessHandle,
|
|
||||||
ProcessImageFileName,
|
|
||||||
FileName,
|
|
||||||
8);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create Process Environment Block
|
* Create Process Environment Block
|
||||||
*/
|
*/
|
||||||
|
@ -342,13 +305,15 @@ RtlCreateUserProcess(PUNICODE_STRING ImageFileName,
|
||||||
ImageBaseAddress + (ULONG)Sii.EntryPoint,
|
ImageBaseAddress + (ULONG)Sii.EntryPoint,
|
||||||
&ProcessInfo->ClientId,
|
&ProcessInfo->ClientId,
|
||||||
&ProcessInfo->ThreadHandle);
|
&ProcessInfo->ThreadHandle);
|
||||||
|
|
||||||
|
NtClose(hSection);
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("Failed to create thread\n");
|
DPRINT("Failed to create thread\n");
|
||||||
NtClose(hSection);
|
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
NtClose(hSection);
|
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: init.c,v 1.48 2004/10/24 20:37:26 weiden Exp $
|
/* $Id: init.c,v 1.49 2004/11/21 21:09:42 weiden Exp $
|
||||||
*
|
*
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ldr/init.c
|
* FILE: ntoskrnl/ldr/init.c
|
||||||
|
@ -146,7 +146,7 @@ LdrpCreateProcessEnvironment(HANDLE ProcessHandle,
|
||||||
RtlCopyMemory(LocalPpb->ImagePathName.Buffer,
|
RtlCopyMemory(LocalPpb->ImagePathName.Buffer,
|
||||||
ImagePath->Buffer,
|
ImagePath->Buffer,
|
||||||
ImagePath->Length);
|
ImagePath->Length);
|
||||||
LocalPpb->ImagePathName.Buffer[ImagePath->Length / sizeof(WCHAR)] = (WCHAR)0;
|
LocalPpb->ImagePathName.Buffer[ImagePath->Length / sizeof(WCHAR)] = L'\0';
|
||||||
|
|
||||||
/* Denormalize the process parameter block */
|
/* Denormalize the process parameter block */
|
||||||
DENORMALIZE(LocalPpb->ImagePathName.Buffer, LocalPpb);
|
DENORMALIZE(LocalPpb->ImagePathName.Buffer, LocalPpb);
|
||||||
|
@ -195,17 +195,6 @@ LdrpCreateProcessEnvironment(HANDLE ProcessHandle,
|
||||||
&RegionSize,
|
&RegionSize,
|
||||||
MEM_RELEASE);
|
MEM_RELEASE);
|
||||||
|
|
||||||
/* Set image file name */
|
|
||||||
Status = NtSetInformationProcess(ProcessHandle,
|
|
||||||
ProcessImageFileName,
|
|
||||||
"SMSS",
|
|
||||||
5);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT("NtSetInformationProcess() failed (Status %lx)\n", Status);
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read image base address. */
|
/* Read image base address. */
|
||||||
Offset = FIELD_OFFSET(PEB, ImageBaseAddress);
|
Offset = FIELD_OFFSET(PEB, ImageBaseAddress);
|
||||||
NtReadVirtualMemory(ProcessHandle,
|
NtReadVirtualMemory(ProcessHandle,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: process.c,v 1.155 2004/11/21 13:18:19 weiden Exp $
|
/* $Id: process.c,v 1.156 2004/11/21 21:09:43 weiden Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -849,6 +849,65 @@ NtCreateProcess(OUT PHANDLE ProcessHandle,
|
||||||
KEBUGCHECK(0);
|
KEBUGCHECK(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (SectionHandle != NULL)
|
||||||
|
{
|
||||||
|
PSECTION_OBJECT SectionObject;
|
||||||
|
UNICODE_STRING FileName;
|
||||||
|
PWCHAR szSrc;
|
||||||
|
PCHAR szDest;
|
||||||
|
USHORT lnFName = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine the image file name and save it to the EPROCESS structure
|
||||||
|
*/
|
||||||
|
Status = ObReferenceObjectByHandle(SectionHandle,
|
||||||
|
0,
|
||||||
|
MmSectionObjectType,
|
||||||
|
UserMode,
|
||||||
|
(PVOID*)&SectionObject,
|
||||||
|
NULL);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DbgPrint("Failed to reference section object\n", Status);
|
||||||
|
ObDereferenceObject(Process);
|
||||||
|
ObDereferenceObject(pParentProcess);
|
||||||
|
return(Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
FileName = SectionObject->FileObject->FileName;
|
||||||
|
szSrc = (PWCHAR)(FileName.Buffer + FileName.Length - 1);
|
||||||
|
while(szSrc >= FileName.Buffer)
|
||||||
|
{
|
||||||
|
if(*szSrc == L'\\')
|
||||||
|
{
|
||||||
|
szSrc++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
szSrc--;
|
||||||
|
lnFName++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* copy the image file name to the process and truncate it to 15 characters
|
||||||
|
if necessary */
|
||||||
|
szDest = Process->ImageFileName;
|
||||||
|
lnFName = min(lnFName, sizeof(Process->ImageFileName) - 1);
|
||||||
|
while(lnFName-- > 0)
|
||||||
|
{
|
||||||
|
*(szDest++) = (UCHAR)*(szSrc++);
|
||||||
|
}
|
||||||
|
*szDest = '\0';
|
||||||
|
|
||||||
|
|
||||||
|
ObDereferenceObject(SectionObject);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Process->ImageFileName[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Map ntdll
|
* Map ntdll
|
||||||
*/
|
*/
|
||||||
|
@ -1255,6 +1314,34 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ProcessImageFileName:
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We DO NOT return the file name stored in the EPROCESS structure.
|
||||||
|
* Propably if we can't find a PEB or ProcessParameters structure for the
|
||||||
|
* process!
|
||||||
|
*/
|
||||||
|
PRTL_USER_PROCESS_PARAMETERS ProcParams;
|
||||||
|
ASSERT(Process->Peb);
|
||||||
|
ASSERT(Process->Peb->ProcessParameters);
|
||||||
|
ProcParams = Process->Peb->ProcessParameters;
|
||||||
|
if(ProcessInformationLength < sizeof(UNICODE_STRING) + ProcParams->ImagePathName.Length + sizeof(WCHAR))
|
||||||
|
{
|
||||||
|
Status = STATUS_INFO_LENGTH_MISMATCH;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PUNICODE_STRING DstPath = (PUNICODE_STRING)ProcessInformation;
|
||||||
|
DstPath->Length = ProcParams->ImagePathName.Length;
|
||||||
|
DstPath->MaximumLength = DstPath->Length + sizeof(WCHAR);
|
||||||
|
DstPath->Buffer = (PWSTR)(DstPath + 1);
|
||||||
|
|
||||||
|
RtlCopyMemory(DstPath->Buffer, ProcParams->ImagePathName.Buffer, ProcParams->ImagePathName.Length);
|
||||||
|
DstPath->Buffer[DstPath->Length / sizeof(WCHAR)] = L'\0';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: The following 10 information classes are verified to not be
|
* Note: The following 10 information classes are verified to not be
|
||||||
* implemented on NT, and do indeed return STATUS_INVALID_INFO_CLASS;
|
* implemented on NT, and do indeed return STATUS_INVALID_INFO_CLASS;
|
||||||
|
@ -1343,11 +1430,6 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
|
||||||
Status = PspAssignPrimaryToken(Process, *ProcessAccessTokenP);
|
Status = PspAssignPrimaryToken(Process, *ProcessAccessTokenP);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ProcessImageFileName:
|
|
||||||
memcpy(Process->ImageFileName, ProcessInformation, 8);
|
|
||||||
Status = STATUS_SUCCESS;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ProcessLdtInformation:
|
case ProcessLdtInformation:
|
||||||
case ProcessLdtSize:
|
case ProcessLdtSize:
|
||||||
case ProcessDefaultHardErrorMode:
|
case ProcessDefaultHardErrorMode:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue