Changed the indentation to a human readable format (no code change). Modified: trunk/reactos/lib/kernel32/process/create.c _____
Modified: trunk/reactos/lib/kernel32/process/create.c --- trunk/reactos/lib/kernel32/process/create.c 2005-04-02 19:26:54 UTC (rev 14453) +++ trunk/reactos/lib/kernel32/process/create.c 2005-04-02 19:33:08 UTC (rev 14454) @@ -27,74 +27,69 @@
typedef NTSTATUS STDCALL (K32_MBSTR_TO_WCSTR) ( - UNICODE_STRING *, - ANSI_STRING *, - BOOLEAN + UNICODE_STRING *, + ANSI_STRING *, + BOOLEAN );
-NTSTATUS STDCALL K32MbStrToWcStr -( - IN K32_MBSTR_TO_WCSTR * True, - UNICODE_STRING * DestStr, - ANSI_STRING * SourceStr, - BOOLEAN Allocate -) +NTSTATUS STDCALL K32MbStrToWcStr(IN K32_MBSTR_TO_WCSTR * True, + UNICODE_STRING * DestStr, + ANSI_STRING * SourceStr, + BOOLEAN Allocate) { - if(SourceStr->Buffer == NULL) - { - DestStr->Length = DestStr->MaximumLength = 0; - DestStr->Buffer = NULL; - return STATUS_SUCCESS; - } + if(SourceStr->Buffer == NULL) + { + DestStr->Length = DestStr->MaximumLength = 0; + DestStr->Buffer = NULL; + return STATUS_SUCCESS; + }
- return True(DestStr, SourceStr, Allocate); + return True(DestStr, SourceStr, Allocate); }
-VOID STDCALL RtlRosR32AttribsToNativeAttribs -( - OUT OBJECT_ATTRIBUTES * NativeAttribs, - IN SECURITY_ATTRIBUTES * Ros32Attribs OPTIONAL -) +VOID STDCALL RtlRosR32AttribsToNativeAttribs(OUT OBJECT_ATTRIBUTES * NativeAttribs, + IN SECURITY_ATTRIBUTES * Ros32Attribs OPTIONAL) { - NativeAttribs->Length = sizeof(*NativeAttribs); - NativeAttribs->ObjectName = NULL; - NativeAttribs->RootDirectory = NULL; - NativeAttribs->Attributes = 0; - NativeAttribs->SecurityQualityOfService = NULL; + NativeAttribs->Length = sizeof(*NativeAttribs); + NativeAttribs->ObjectName = NULL; + NativeAttribs->RootDirectory = NULL; + NativeAttribs->Attributes = 0; + NativeAttribs->SecurityQualityOfService = NULL;
- if(Ros32Attribs != NULL && Ros32Attribs->nLength >= sizeof(*Ros32Attribs)) - { - NativeAttribs->SecurityDescriptor = Ros32Attribs->lpSecurityDescriptor; + if(Ros32Attribs != NULL && Ros32Attribs->nLength >= sizeof(*Ros32Attribs)) + { + NativeAttribs->SecurityDescriptor = Ros32Attribs->lpSecurityDescriptor;
- if(Ros32Attribs->bInheritHandle) - NativeAttribs->Attributes |= OBJ_INHERIT; - } - else - NativeAttribs->SecurityDescriptor = NULL; + if(Ros32Attribs->bInheritHandle) + { + NativeAttribs->Attributes |= OBJ_INHERIT; + } + } + else + { + NativeAttribs->SecurityDescriptor = NULL; + } }
-VOID STDCALL RtlRosR32AttribsToNativeAttribsNamed -( - OUT OBJECT_ATTRIBUTES * NativeAttribs, - IN SECURITY_ATTRIBUTES * Ros32Attribs OPTIONAL, - OUT UNICODE_STRING * NativeName OPTIONAL, - IN WCHAR * Ros32Name OPTIONAL, - IN HANDLE Ros32NameRoot OPTIONAL -) +VOID STDCALL RtlRosR32AttribsToNativeAttribsNamed(OUT OBJECT_ATTRIBUTES * NativeAttribs, + IN SECURITY_ATTRIBUTES * Ros32Attribs OPTIONAL, + OUT UNICODE_STRING * NativeName OPTIONAL, + IN WCHAR * Ros32Name OPTIONAL, + IN HANDLE Ros32NameRoot OPTIONAL) { - if(!NativeAttribs) return; + if(!NativeAttribs) return;
- RtlRosR32AttribsToNativeAttribs(NativeAttribs, Ros32Attribs); + RtlRosR32AttribsToNativeAttribs(NativeAttribs, Ros32Attribs);
- if(Ros32Name != NULL && NativeName != NULL) - { - RtlInitUnicodeString(NativeName, Ros32Name); + if(Ros32Name != NULL && NativeName != NULL) + { + RtlInitUnicodeString(NativeName, Ros32Name);
- NativeAttribs->ObjectName = NativeName; - NativeAttribs->RootDirectory = Ros32NameRoot; - NativeAttribs->Attributes |= OBJ_CASE_INSENSITIVE; - } + NativeAttribs->ObjectName = NativeName; + NativeAttribs->RootDirectory = Ros32NameRoot; + NativeAttribs->Attributes |= OBJ_CASE_INSENSITIVE; + } }
@@ -144,12 +139,9 @@ BOOL bRetVal; STARTUPINFOW wsiStartupInfo;
- NTSTATUS STDCALL_FUNC (*pTrue) - ( - UNICODE_STRING *, - ANSI_STRING *, - BOOLEAN - ); + NTSTATUS STDCALL_FUNC (*pTrue)(UNICODE_STRING *, + ANSI_STRING *, + BOOLEAN);
ULONG STDCALL_FUNC (*pRtlMbStringToUnicodeSize)(ANSI_STRING *);
@@ -318,9 +310,13 @@
/* translate EXCEPTION_XXX defines into EXCEPTION_DISPOSITION enum values */ if (ExceptionDisposition == EXCEPTION_CONTINUE_EXECUTION) - return ExceptionContinueExecution; + { + return ExceptionContinueExecution; + } else if (ExceptionDisposition == EXCEPTION_CONTINUE_SEARCH) - return ExceptionContinueSearch; + { + return ExceptionContinueSearch; + }
return -1; /* unknown return from UnhandledExceptionFilter */ } @@ -343,102 +339,93 @@ }
-HANDLE STDCALL KlCreateFirstThread -( - HANDLE ProcessHandle, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - PSECTION_IMAGE_INFORMATION Sii, - LPTHREAD_START_ROUTINE lpStartAddress, - DWORD dwCreationFlags, - LPDWORD lpThreadId -) +HANDLE STDCALL KlCreateFirstThread(HANDLE ProcessHandle, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + PSECTION_IMAGE_INFORMATION Sii, + LPTHREAD_START_ROUTINE lpStartAddress, + DWORD dwCreationFlags, + LPDWORD lpThreadId) { - OBJECT_ATTRIBUTES oaThreadAttribs; - CLIENT_ID cidClientId; - PVOID pTrueStartAddress; - NTSTATUS nErrCode; - HANDLE hThread; + OBJECT_ATTRIBUTES oaThreadAttribs; + CLIENT_ID cidClientId; + PVOID pTrueStartAddress; + NTSTATUS nErrCode; + HANDLE hThread;
- /* convert the thread attributes */ - RtlRosR32AttribsToNativeAttribs(&oaThreadAttribs, lpThreadAttributes); + /* convert the thread attributes */ + RtlRosR32AttribsToNativeAttribs(&oaThreadAttribs, lpThreadAttributes);
- /* native image */ - if(Sii->Subsystem != IMAGE_SUBSYSTEM_NATIVE) - pTrueStartAddress = (PVOID)BaseProcessStart; - /* Win32 image */ - else - pTrueStartAddress = (PVOID)RtlBaseProcessStartRoutine; + /* native image */ + if(Sii->Subsystem != IMAGE_SUBSYSTEM_NATIVE) + { + pTrueStartAddress = (PVOID)BaseProcessStart; + } + /* Win32 image */ + else + { + pTrueStartAddress = (PVOID)RtlBaseProcessStartRoutine; + }
- DPRINT - ( - "RtlRosCreateUserThreadVa\n" - "(\n" - " ProcessHandle %p,\n" - " ObjectAttributes %p,\n" - " CreateSuspended %d,\n" - " StackZeroBits %d,\n" - " StackReserve %lu,\n" - " StackCommit %lu,\n" - " StartAddress %p,\n" - " ThreadHandle %p,\n" - " ClientId %p,\n" - " ParameterCount %u,\n" - " Parameters[0] %p,\n" - " Parameters[1] %p\n" - ")\n", - ProcessHandle, - &oaThreadAttribs, - dwCreationFlags & CREATE_SUSPENDED, - 0, - Sii->StackReserve, - Sii->StackCommit, - pTrueStartAddress, - &hThread, - &cidClientId, - 2, - lpStartAddress, - PEB_BASE - ); + DPRINT("RtlRosCreateUserThreadVa\n" + "(\n" + " ProcessHandle %p,\n" + " ObjectAttributes %p,\n" + " CreateSuspended %d,\n" + " StackZeroBits %d,\n" + " StackReserve %lu,\n" + " StackCommit %lu,\n" + " StartAddress %p,\n" + " ThreadHandle %p,\n" + " ClientId %p,\n" + " ParameterCount %u,\n" + " Parameters[0] %p,\n" + " Parameters[1] %p\n" + ")\n", + ProcessHandle, + &oaThreadAttribs, + dwCreationFlags & CREATE_SUSPENDED, + 0, + Sii->StackReserve, + Sii->StackCommit, + pTrueStartAddress, + &hThread, + &cidClientId, + 2, + lpStartAddress, + PEB_BASE);
- /* create the first thread */ - nErrCode = RtlRosCreateUserThreadVa - ( - ProcessHandle, - &oaThreadAttribs, - dwCreationFlags & CREATE_SUSPENDED, - 0, - &(Sii->StackReserve), - &(Sii->StackCommit), - pTrueStartAddress, - &hThread, - &cidClientId, - 2, - (ULONG_PTR)lpStartAddress, - (ULONG_PTR)PEB_BASE - ); - - /* failure */ - if(!NT_SUCCESS(nErrCode)) - { - SetLastErrorByStatus(nErrCode); - return NULL; - } + /* create the first thread */ + nErrCode = RtlRosCreateUserThreadVa(ProcessHandle, + &oaThreadAttribs, + dwCreationFlags & CREATE_SUSPENDED, + 0, + &(Sii->StackReserve), + &(Sii->StackCommit), + pTrueStartAddress, + &hThread, + &cidClientId, + 2, + (ULONG_PTR)lpStartAddress, + (ULONG_PTR)PEB_BASE); + /* failure */ + if(!NT_SUCCESS(nErrCode)) + { + SetLastErrorByStatus(nErrCode); + return NULL; + }
- DPRINT - ( - "StackReserve %p\n" - "StackCommit %p\n" - "ThreadHandle %p\n" - "ClientId.UniqueThread %p\n", - Sii->StackReserve, - Sii->StackCommit, - hThread, - cidClientId.UniqueThread - ); + DPRINT("StackReserve %p\n" + "StackCommit %p\n" + "ThreadHandle %p\n" + "ClientId.UniqueThread %p\n", + Sii->StackReserve, + Sii->StackCommit, + hThread, + cidClientId.UniqueThread);
- /* success */ - if(lpThreadId) *lpThreadId = (DWORD)cidClientId.UniqueThread; - return hThread; + /* success */ + if(lpThreadId) *lpThreadId = (DWORD)cidClientId.UniqueThread; + return hThread; }
HANDLE KlMapFile(LPCWSTR lpApplicationName) @@ -476,20 +463,20 @@ */
Status = NtOpenFile(&hFile, - SYNCHRONIZE|FILE_EXECUTE|FILE_READ_DATA, - &ObjectAttributes, - &IoStatusBlock, - FILE_SHARE_DELETE|FILE_SHARE_READ, - FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE); + SYNCHRONIZE|FILE_EXECUTE|FILE_READ_DATA, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_DELETE|FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE);
RtlFreeUnicodeString (&ApplicationNameString);
if (!NT_SUCCESS(Status)) - { - DPRINT("Failed to open file\n"); - SetLastErrorByStatus (Status); - return(NULL); - } + { + DPRINT("Failed to open file\n"); + SetLastErrorByStatus (Status); + return(NULL); + }
Status = NtCreateSection(&hSection, SECTION_ALL_ACCESS, @@ -501,32 +488,29 @@ NtClose(hFile);
if (!NT_SUCCESS(Status)) - { - DPRINT("Failed to create section\n"); - SetLastErrorByStatus (Status); - return(NULL); - } + { + DPRINT("Failed to create section\n"); + SetLastErrorByStatus (Status); + return(NULL); + }
return(hSection); }
-static NTSTATUS KlInitPeb -( - HANDLE ProcessHandle, - PRTL_USER_PROCESS_PARAMETERS Ppb, - PVOID * ImageBaseAddress, - ULONG ImageSubSystem -) +static NTSTATUS KlInitPeb(HANDLE ProcessHandle, + PRTL_USER_PROCESS_PARAMETERS Ppb, + PVOID * ImageBaseAddress, + ULONG ImageSubSystem) { - NTSTATUS Status; - PVOID PpbBase; - ULONG PpbSize; - ULONG BytesWritten; - ULONG Offset; - PVOID ParentEnv = NULL; - PVOID EnvPtr = NULL; - PWCHAR ptr; - ULONG EnvSize = 0, EnvSize1 = 0; + NTSTATUS Status; + PVOID PpbBase; + ULONG PpbSize; + ULONG BytesWritten; + ULONG Offset; + PVOID ParentEnv = NULL; + PVOID EnvPtr = NULL; + PWCHAR ptr; + ULONG EnvSize = 0, EnvSize1 = 0;
/* create the Environment */ if (Ppb->Environment != NULL) @@ -535,7 +519,7 @@ ptr = ParentEnv; while (*ptr) { - while(*ptr++); + while(*ptr++); } ptr++; EnvSize = (PVOID)ptr - ParentEnv; @@ -545,41 +529,41 @@ MEMORY_BASIC_INFORMATION MemInfo; ParentEnv = NtCurrentPeb()->ProcessParameters->Environment;
- Status = NtQueryVirtualMemory (NtCurrentProcess (), - ParentEnv, - MemoryBasicInformation, - &MemInfo, - sizeof(MEMORY_BASIC_INFORMATION), - NULL); - if (!NT_SUCCESS(Status)) - { - return Status; - } - EnvSize = MemInfo.RegionSize; - } + Status = NtQueryVirtualMemory (NtCurrentProcess (), + ParentEnv, + MemoryBasicInformation, + &MemInfo, + sizeof(MEMORY_BASIC_INFORMATION), + NULL); + if (!NT_SUCCESS(Status)) + { + return Status; + } + EnvSize = MemInfo.RegionSize; + } DPRINT("EnvironmentSize %ld\n", EnvSize);
/* allocate and initialize new environment block */ if (EnvSize != 0) - { - EnvSize1 = EnvSize; - Status = NtAllocateVirtualMemory(ProcessHandle, - &EnvPtr, - 0, - &EnvSize1, - MEM_RESERVE | MEM_COMMIT, - PAGE_READWRITE); - if (!NT_SUCCESS(Status)) - { - return(Status); - } + { + EnvSize1 = EnvSize; + Status = NtAllocateVirtualMemory(ProcessHandle, + &EnvPtr, + 0, + &EnvSize1, + MEM_RESERVE | MEM_COMMIT, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + return(Status); + }
- NtWriteVirtualMemory(ProcessHandle, - EnvPtr, - ParentEnv, - EnvSize, - &BytesWritten); - } + NtWriteVirtualMemory(ProcessHandle, + EnvPtr, + ParentEnv, + EnvSize, + &BytesWritten); + }
/* create the PPB */ PpbBase = NULL; @@ -591,9 +575,9 @@ MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (!NT_SUCCESS(Status)) - { - return(Status); - } + { + return(Status); + }
//DPRINT("Ppb->MaximumLength %x\n", Ppb->MaximumLength); NtWriteVirtualMemory(ProcessHandle, @@ -651,102 +635,102 @@ GetFileName(LPCWSTR CurDir, LPCWSTR AppName, LPWSTR CmdLine, LPWSTR Buffer, unsigned BufLen) { - WCHAR *Name, *Pos, *Ret = NULL; - const WCHAR *p; + WCHAR *Name, *Pos, *Ret = NULL; + const WCHAR *p;
- /* if we have an app name, everything is easy */ + /* if we have an app name, everything is easy */
- if (NULL != AppName) - { + if (NULL != AppName) + { /* use the unmodified app name as file name */ wcsncpy(Buffer, AppName, BufLen ); Ret = CmdLine; if (NULL == Ret || L'\0' == CmdLine[0]) - { - /* no command-line, create one */ - Ret = RtlAllocateHeap(GetProcessHeap(), 0, (wcslen(AppName) + 3) * sizeof(WCHAR)); - if (NULL != Ret) - { - Ret[0] = L'"'; - wcscpy(Ret + 1, AppName); - wcscat(Ret, L"""); - } - } - return Ret; - } + { + /* no command-line, create one */ + Ret = RtlAllocateHeap(GetProcessHeap(), 0, (wcslen(AppName) + 3) * sizeof(WCHAR)); + if (NULL != Ret) + { + Ret[0] = L'"'; + wcscpy(Ret + 1, AppName); + wcscat(Ret, L"""); + } + } + return Ret; + }
- if (NULL == CmdLine) - { + if (NULL == CmdLine) + { SetLastError(ERROR_INVALID_PARAMETER); return NULL; - } + }
- /* first check for a quoted file name */ - if (L'"' == CmdLine[0] && NULL != (p = wcschr(CmdLine + 1, L'"'))) - { + /* first check for a quoted file name */ + if (L'"' == CmdLine[0] && NULL != (p = wcschr(CmdLine + 1, L'"'))) + { int Len = p - CmdLine - 1; /* extract the quoted portion as file name */ Name = RtlAllocateHeap(GetProcessHeap(), 0, (Len + 1) * sizeof(WCHAR)); if (NULL == Name) - { - return NULL; - } + { + return NULL; + } memcpy(Name, CmdLine + 1, Len * sizeof(WCHAR)); Name[Len] = L'\0';
if (SearchPathW(NULL, Name, L".exe", BufLen, Buffer, NULL)) - { - Ret = CmdLine; /* no change necessary */ - } + { + Ret = CmdLine; /* no change necessary */ + }
RtlFreeHeap(GetProcessHeap(), 0, Name); return Ret; - } + }
- /* now try the command-line word by word */ - Name = RtlAllocateHeap(GetProcessHeap(), 0, (wcslen(CmdLine) + 1) * sizeof(WCHAR)); - if (NULL == Name) - { + /* now try the command-line word by word */ + Name = RtlAllocateHeap(GetProcessHeap(), 0, (wcslen(CmdLine) + 1) * sizeof(WCHAR)); + if (NULL == Name) + { return NULL; - } - Pos = Name; - p = CmdLine; + } + Pos = Name; + p = CmdLine;
- while (L'\0' != *p) - { + while (L'\0' != *p) + { do - { - *Pos++ = *p++; - } + { + *Pos++ = *p++; + } while (L'\0' != *p && L' ' != *p); *Pos = 0; if (SearchPathW(NULL, Name, L".exe", BufLen, Buffer, NULL)) - { - Ret = CmdLine; - break; - } - } + { + Ret = CmdLine; + break; + } + }
- if (NULL == Ret || NULL == wcschr(Name, L' ')) - { + if (NULL == Ret || NULL == wcschr(Name, L' ')) + { RtlFreeHeap(GetProcessHeap(), 0, Name); /* no change necessary */ return Ret; - } + }
- /* now build a new command-line with quotes */ - Ret = RtlAllocateHeap(GetProcessHeap(), 0, (wcslen(CmdLine) + 3) * sizeof(WCHAR)); - if (NULL == Ret) - { + /* now build a new command-line with quotes */ + Ret = RtlAllocateHeap(GetProcessHeap(), 0, (wcslen(CmdLine) + 3) * sizeof(WCHAR)); + if (NULL == Ret) + { RtlFreeHeap(GetProcessHeap(), 0, Name); /* no change necessary */ return NULL; - } - Ret[0] = L'"'; - wcscpy(Ret + 1, Name); - wcscat(Ret, L"""); - wcscat(Ret, p); + } + Ret[0] = L'"'; + wcscpy(Ret + 1, Name); + wcscat(Ret, L"""); + wcscat(Ret, p);
- RtlFreeHeap(GetProcessHeap(), 0, Name); - return Ret; + RtlFreeHeap(GetProcessHeap(), 0, Name); + return Ret; }
@@ -754,19 +738,16 @@ * @implemented */ BOOL STDCALL -CreateProcessW -( - LPCWSTR lpApplicationName, - LPWSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCWSTR lpCurrentDirectory, - LPSTARTUPINFOW lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation -) +CreateProcessW(LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation) { HANDLE hSection, hProcess, hThread; NTSTATUS Status; @@ -798,99 +779,99 @@ PVOID ProcSecurity = NULL;
DPRINT("CreateProcessW(lpApplicationName '%S', lpCommandLine '%S')\n", - lpApplicationName, lpCommandLine); + lpApplicationName, lpCommandLine);
TidyCmdLine = GetFileName(lpCurrentDirectory, lpApplicationName, lpCommandLine, Name, sizeof(Name) / sizeof(WCHAR)); if (NULL == TidyCmdLine) - { - return FALSE; - } + { + return FALSE; + } DPRINT("TidyCmdLine '%S'\n", TidyCmdLine);
if (lpApplicationName != NULL && lpApplicationName[0] != 0) - { - wcscpy (TempApplicationNameW, lpApplicationName); - i = wcslen(TempApplicationNameW); - if (TempApplicationNameW[i - 1] == L'.') - { - TempApplicationNameW[i - 1] = 0; - } - else - { - s = max(wcsrchr(TempApplicationNameW, L'\'), wcsrchr(TempApplicationNameW, L'/')); - if (s == NULL) - { - s = TempApplicationNameW; - } - else - { - s++; - } + { + wcscpy (TempApplicationNameW, lpApplicationName); + i = wcslen(TempApplicationNameW); + if (TempApplicationNameW[i - 1] == L'.') + { + TempApplicationNameW[i - 1] = 0; + } + else + { + s = max(wcsrchr(TempApplicationNameW, L'\'), wcsrchr(TempApplicationNameW, L'/')); + if (s == NULL) + { + s = TempApplicationNameW; + } + else + { + s++; + } + e = wcsrchr(s, L'.'); + if (e == NULL) + { + wcscat(s, L".exe"); e = wcsrchr(s, L'.'); - if (e == NULL) - { - wcscat(s, L".exe"); - e = wcsrchr(s, L'.'); - } - } - } + } + } + } else if (L'"' == TidyCmdLine[0]) - { - wcscpy(TempApplicationNameW, TidyCmdLine + 1); - s = wcschr(TempApplicationNameW, L'"'); - if (NULL == s) - { - return FALSE; - } - *s = L'\0'; - } + { + wcscpy(TempApplicationNameW, TidyCmdLine + 1); + s = wcschr(TempApplicationNameW, L'"'); + if (NULL == s) + { + return FALSE; + } + *s = L'\0'; + } else - { - wcscpy(TempApplicationNameW, TidyCmdLine); - s = wcschr(TempApplicationNameW, L' '); - if (NULL != s) - { - *s = L'\0'; - } - } + { + wcscpy(TempApplicationNameW, TidyCmdLine); + s = wcschr(TempApplicationNameW, L' '); + if (NULL != s) + { + *s = L'\0'; + } + } s = max(wcsrchr(TempApplicationNameW, L'\'), wcsrchr(TempApplicationNameW, L'/')); if (NULL == s) - { - s = TempApplicationNameW; - } + { + s = TempApplicationNameW; + } s = wcsrchr(s, L'.'); if (NULL == s) - { - wcscat(TempApplicationNameW, L".exe"); - } + { + wcscat(TempApplicationNameW, L".exe"); + }
if (!SearchPathW(NULL, TempApplicationNameW, NULL, sizeof(ImagePathName)/sizeof(WCHAR), ImagePathName, &s)) { - return FALSE; + return FALSE; }
e = wcsrchr(s, L'.'); if (e != NULL && (!_wcsicmp(e, L".bat") || !_wcsicmp(e, L".cmd"))) { - // the command is a batch file - IsBatchFile = TRUE; - if (lpApplicationName != NULL && lpApplicationName[0]) - { - // FIXME: use COMSPEC for the command interpreter - wcscpy(TempCommandLineNameW, L"cmd /c "); - wcscat(TempCommandLineNameW, lpApplicationName); - lpCommandLine = TempCommandLineNameW; - wcscpy(TempApplicationNameW, L"cmd.exe"); - if (!SearchPathW(NULL, TempApplicationNameW, NULL, sizeof(ImagePathName)/sizeof(WCHAR), ImagePathName, &s)) - { - return FALSE; - } - } - else - { - return FALSE; - } + // the command is a batch file + IsBatchFile = TRUE; + if (lpApplicationName != NULL && lpApplicationName[0]) + { + // FIXME: use COMSPEC for the command interpreter + wcscpy(TempCommandLineNameW, L"cmd /c "); + wcscat(TempCommandLineNameW, lpApplicationName); + lpCommandLine = TempCommandLineNameW; + wcscpy(TempApplicationNameW, L"cmd.exe"); + if (!SearchPathW(NULL, TempApplicationNameW, NULL, sizeof(ImagePathName)/sizeof(WCHAR), ImagePathName, &s)) + { + return FALSE; + } + } + else + { + return FALSE; + } }
/* @@ -905,16 +886,16 @@
/* Initialize the current directory string */ if (lpCurrentDirectory != NULL) - { - RtlInitUnicodeString(&CurrentDirectory_U, - lpCurrentDirectory); - } + { + RtlInitUnicodeString(&CurrentDirectory_U, + lpCurrentDirectory); + } else - { - GetCurrentDirectoryW(256, TempCurrentDirectoryW); - RtlInitUnicodeString(&CurrentDirectory_U, - TempCurrentDirectoryW); - } + { + GetCurrentDirectoryW(256, TempCurrentDirectoryW); + RtlInitUnicodeString(&CurrentDirectory_U, + TempCurrentDirectoryW); + }
/* * Create a section for the executable @@ -924,91 +905,95 @@ if (hSection == NULL) { ///////////////////////////////////////// - /* - * Inspect the image to determine executable flavour - */ - IO_STATUS_BLOCK IoStatusBlock; - UNICODE_STRING ApplicationNameString; - OBJECT_ATTRIBUTES ObjectAttributes; - PSECURITY_DESCRIPTOR SecurityDescriptor = NULL; - IMAGE_DOS_HEADER DosHeader; - IO_STATUS_BLOCK Iosb; - LARGE_INTEGER Offset; - HANDLE hFile = NULL; + /* + * Inspect the image to determine executable flavour + */ + IO_STATUS_BLOCK IoStatusBlock; + UNICODE_STRING ApplicationNameString; + OBJECT_ATTRIBUTES ObjectAttributes; + PSECURITY_DESCRIPTOR SecurityDescriptor = NULL; + IMAGE_DOS_HEADER DosHeader; + IO_STATUS_BLOCK Iosb; + LARGE_INTEGER Offset; + HANDLE hFile = NULL; + DPRINT("Inspecting Image Header for image type id\n");
- DPRINT("Inspecting Image Header for image type id\n"); + // Find the application name + if (!RtlDosPathNameToNtPathName_U((LPWSTR)lpApplicationName, + &ApplicationNameString, NULL, NULL)) + { + return FALSE; + } + DPRINT("ApplicationName %S\n",ApplicationNameString.Buffer);
- // Find the application name - if (!RtlDosPathNameToNtPathName_U((LPWSTR)lpApplicationName, - &ApplicationNameString, NULL, NULL)) { - return FALSE; - } - DPRINT("ApplicationName %S\n",ApplicationNameString.Buffer); + InitializeObjectAttributes(&ObjectAttributes, + &ApplicationNameString, + OBJ_CASE_INSENSITIVE, + NULL, + SecurityDescriptor);
- InitializeObjectAttributes(&ObjectAttributes, - &ApplicationNameString, - OBJ_CASE_INSENSITIVE, - NULL, - SecurityDescriptor); + // Try to open the executable + Status = NtOpenFile(&hFile, + SYNCHRONIZE|FILE_EXECUTE|FILE_READ_DATA, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_DELETE|FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE);
- // Try to open the executable - Status = NtOpenFile(&hFile, - SYNCHRONIZE|FILE_EXECUTE|FILE_READ_DATA, - &ObjectAttributes, - &IoStatusBlock, - FILE_SHARE_DELETE|FILE_SHARE_READ, - FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE); + RtlFreeUnicodeString(&ApplicationNameString);
- RtlFreeUnicodeString(&ApplicationNameString); + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed to open file\n"); + SetLastErrorByStatus(Status); + return FALSE; + }
- if (!NT_SUCCESS(Status)) { - DPRINT("Failed to open file\n"); - SetLastErrorByStatus(Status); - return FALSE; - } + // Read the dos header + Offset.QuadPart = 0; + Status = ZwReadFile(hFile, + NULL, + NULL, + NULL, + &Iosb, + &DosHeader, [truncated at 1000 lines; 325 more skipped]