diff --git a/reactos/include/ddk/pstypes.h b/reactos/include/ddk/pstypes.h index 62c80e809f7..bb473407844 100644 --- a/reactos/include/ddk/pstypes.h +++ b/reactos/include/ddk/pstypes.h @@ -46,32 +46,37 @@ typedef struct linux_sigcontext { typedef ULONG THREADINFOCLASS; -typedef struct _PROCESSINFO +typedef struct _PPB { - WCHAR WindowTitle[MAX_PATH]; - WCHAR ImageFile[MAX_PATH]; - WCHAR CommandLine[MAX_PATH]; - WCHAR DllPath[MAX_PATH]; - WCHAR Reserved[MAX_PATH]; - WCHAR Desktop[MAX_PATH]; - WCHAR Title[MAX_PATH]; - PVOID Environment; - DWORD dwX; - DWORD dwY; - DWORD dwXSize; - DWORD dwYSize; - DWORD dwXCountChars; - DWORD dwYCountChars; - DWORD dwFillAttribute; - DWORD dwFlags; - WORD wShowWindow; - WORD cbReserved2; - unsigned char *lpReserved2; - HANDLE hStdInput; - HANDLE hStdOutput; - HANDLE hStdError; -} PROCESSINFO, *PPROCESSINFO; - + ULONG TotalSize; // 00h + ULONG DataSize; // 04h + BOOLEAN Normalized; // 08h + ULONG Unknown1; // 0Ch + ULONG Unknown2; // 10h + ULONG Unknown3; // 14h + HANDLE InputHandle; // 18h + HANDLE OutputHandle; // 1Ch + HANDLE ErrorHandle; // 20h + UNICODE_STRING CurrentDirectory; // 24h + ULONG Unknown4; // 2Ch + UNICODE_STRING LibraryPath; // 30h + UNICODE_STRING CommandLine; // 38h + UNICODE_STRING ImageName; // 40h + PVOID Environment; // 48h + DWORD X; // 4Ch + DWORD Y; // 50h + DWORD XSize; // 54h + DWORD YSize; // 58h + DWORD XCountChars; // 5Ch + DWORD YCountChars; // 60h + DWORD FillAttribute; // 64h + DWORD Flags; // 68h + DWORD ShowWindow; // 6Ch + UNICODE_STRING Title; // 70h + UNICODE_STRING Desktop; // 78h + UNICODE_STRING Reserved; // 80h + UNICODE_STRING Reserved2; // 88h +} PPB, *PPPB; typedef struct _LDR { @@ -82,7 +87,7 @@ typedef struct _LDR { } LDR, *PLDR; -typedef struct _NT_PEB +typedef struct _PEB { UCHAR InheritedAddressSpace; // 00 UCHAR ReadImageFileExecOptions; // 01h @@ -90,10 +95,11 @@ typedef struct _NT_PEB LONG ImageBaseAddress; // 03h LDR Ldr; // 07h + PPPB Ppb; // 10h + WORD NumberOfProcessors; // 11h WORD NtGlobalFlag; // 13h - PPROCESSINFO ProcessInfo; // 15h HANDLE ProcessHeap; // 19h ATOMTABLE LocalAtomTable; // 1Dh LPCRITICAL_SECTION CriticalSection; // 35h @@ -102,7 +108,7 @@ typedef struct _NT_PEB WORD MinorVersion; // 3Fh WORD BuildNumber; // 41h WORD PlatformId; // 43h -} NT_PEB, *PNT_PEB; +} PEB, *PPEB; typedef struct _CLIENT_ID { @@ -130,7 +136,7 @@ typedef struct _NT_TEB CLIENT_ID Cid; // 20h ULONG reserved2; // 28h ??? ULONG reserved3; // 2Ch ??? - PNT_PEB Peb; // 30h + PPEB Peb; // 30h DWORD LastErrorCode; // 34h HANDLE RPCHandle; // 36 @@ -371,7 +377,7 @@ typedef struct _EPROCESS UCHAR ExitProcessCalled; UCHAR CreateProcessReported; HANDLE SectionHandle; - PNT_PEB Peb; + PPEB Peb; PVOID SectionBaseAddress; PVOID QuotaBlock; NTSTATUS LastThreadExitStatus; diff --git a/reactos/include/ddk/zw.h b/reactos/include/ddk/zw.h index df16d662da3..26aa51a9866 100644 --- a/reactos/include/ddk/zw.h +++ b/reactos/include/ddk/zw.h @@ -1,4 +1,4 @@ -/* $Id: zw.h,v 1.21 1999/11/25 10:47:53 dwelch Exp $ +/* $Id: zw.h,v 1.22 1999/12/06 00:14:47 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -75,7 +75,7 @@ typedef struct _TOKEN_USER { * FUNCTION: Checks a clients access rights to a object * ARGUMENTS: * SecurityDescriptor = Security information against which the access is checked - * ClientToken = Represents a client + * ClientToken = Represents a client * DesiredAcces = * GenericMapping = * PrivilegeSet = @@ -93,11 +93,12 @@ NtAccessCheck( IN HANDLE ClientToken, IN ACCESS_MASK DesiredAcces, IN PGENERIC_MAPPING GenericMapping, - OUT PPRIVILEGE_SET PrivilegeSet, + OUT PPRIVILEGE_SET PrivilegeSet, OUT PULONG ReturnLength, OUT PULONG GrantedAccess, OUT PBOOLEAN AccessStatus ); + NTSTATUS STDCALL ZwAccessCheck( @@ -105,7 +106,7 @@ ZwAccessCheck( IN HANDLE ClientToken, IN ACCESS_MASK DesiredAcces, IN PGENERIC_MAPPING GenericMapping, - OUT PPRIVILEGE_SET PrivilegeSet, + OUT PPRIVILEGE_SET PrivilegeSet, OUT PULONG ReturnLength, OUT PULONG GrantedAccess, OUT PBOOLEAN AccessStatus @@ -114,15 +115,15 @@ ZwAccessCheck( /* * FUNCTION: Checks a clients access rights to a object and issues a audit a alarm. ( it logs the access ) * ARGUMENTS: - SubsystemName = Specifies the name of the subsystem, can be "WIN32" or "DEBUG" - ObjectHandle = - ObjectAttributes = - DesiredAcces = - GenericMapping = - ObjectCreation = - GrantedAccess = - AccessStatus = - GenerateOnClose = + * SubsystemName = Specifies the name of the subsystem, can be "WIN32" or "DEBUG" + * ObjectHandle = + * ObjectAttributes = + * DesiredAcces = + * GenericMapping = + * ObjectCreation = + * GrantedAccess = + * AccessStatus = + * GenerateOnClose = * REMARKS: The arguments map to the win32 AccessCheck * RETURNS: Status */ @@ -131,29 +132,29 @@ NTSTATUS STDCALL NtAccessCheckAndAuditAlarm( IN PUNICODE_STRING SubsystemName, - IN PHANDLE ObjectHandle, + IN PHANDLE ObjectHandle, IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ACCESS_MASK DesiredAccess, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PULONG GrantedAccess, - OUT PBOOLEAN AccessStatus, - OUT PBOOLEAN GenerateOnClose - ); + IN ACCESS_MASK DesiredAccess, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PULONG GrantedAccess, + OUT PBOOLEAN AccessStatus, + OUT PBOOLEAN GenerateOnClose + ); NTSTATUS STDCALL ZwAccessCheckAndAuditAlarm( IN PUNICODE_STRING SubsystemName, - IN PHANDLE ObjectHandle, + IN PHANDLE ObjectHandle, IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ACCESS_MASK DesiredAccess, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PULONG GrantedAccess, - OUT PBOOLEAN AccessStatus, - OUT PBOOLEAN GenerateOnClose - ); + IN ACCESS_MASK DesiredAccess, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PULONG GrantedAccess, + OUT PBOOLEAN AccessStatus, + OUT PBOOLEAN GenerateOnClose + ); /* * FUNCTION: Adds an atom to the global atom table @@ -182,14 +183,14 @@ ZwAddAtom( /* * FUNCTION: Adjusts the groups in an access token * ARGUMENTS: - TokenHandle = Specifies the access token - * ResetToDefault = If true the NewState parameter is ignored and the groups are set to - their default state, if false the groups specified in - NewState are set. - NewState = - BufferLength = Specifies the size of the buffer for the PreviousState. - PreviousState = - ReturnLength = Bytes written in PreviousState buffer. + * TokenHandle = Specifies the access token + * ResetToDefault = If true the NewState parameter is ignored and the groups are set to + * their default state, if false the groups specified in + * NewState are set. + * NewState = + * BufferLength = Specifies the size of the buffer for the PreviousState. + * PreviousState = + * ReturnLength = Bytes written in PreviousState buffer. * REMARKS: The arguments map to the win32 AdjustTokenGroups * RETURNS: Status */ @@ -198,29 +199,29 @@ NTSTATUS STDCALL NtAdjustGroupsToken( IN HANDLE TokenHandle, - IN BOOLEAN ResetToDefault, - IN PTOKEN_GROUPS NewState, - IN ULONG BufferLength, - OUT PTOKEN_GROUPS PreviousState OPTIONAL, - OUT PULONG ReturnLength + IN BOOLEAN ResetToDefault, + IN PTOKEN_GROUPS NewState, + IN ULONG BufferLength, + OUT PTOKEN_GROUPS PreviousState OPTIONAL, + OUT PULONG ReturnLength ); -NTSTATUS -STDCALL +NTSTATUS +STDCALL ZwAdjustGroupsToken( - IN HANDLE TokenHandle, - IN BOOLEAN ResetToDefault, - IN PTOKEN_GROUPS NewState, - IN ULONG BufferLength, - OUT PTOKEN_GROUPS PreviousState, - OUT PULONG ReturnLength + IN HANDLE TokenHandle, + IN BOOLEAN ResetToDefault, + IN PTOKEN_GROUPS NewState, + IN ULONG BufferLength, + OUT PTOKEN_GROUPS PreviousState, + OUT PULONG ReturnLength ); /* - * FUNCTION: - * - * ARGUMENTS: + * FUNCTION: + * + * ARGUMENTS: * TokenHandle = Handle to the access token * DisableAllPrivileges = The resulting suspend count. NewState = @@ -235,23 +236,23 @@ ZwAdjustGroupsToken( NTSTATUS STDCALL NtAdjustPrivilegesToken( - IN HANDLE TokenHandle, + IN HANDLE TokenHandle, IN BOOLEAN DisableAllPrivileges, - IN PTOKEN_PRIVILEGES NewState, - IN ULONG BufferLength, - OUT PTOKEN_PRIVILEGES PreviousState, - OUT PULONG ReturnLength + IN PTOKEN_PRIVILEGES NewState, + IN ULONG BufferLength, + OUT PTOKEN_PRIVILEGES PreviousState, + OUT PULONG ReturnLength ); NTSTATUS STDCALL ZwAdjustPrivilegesToken( - IN HANDLE TokenHandle, + IN HANDLE TokenHandle, IN BOOLEAN DisableAllPrivileges, - IN PTOKEN_PRIVILEGES NewState, - IN ULONG BufferLength, - OUT PTOKEN_PRIVILEGES PreviousState, - OUT PULONG ReturnLength + IN PTOKEN_PRIVILEGES NewState, + IN ULONG BufferLength, + OUT PTOKEN_PRIVILEGES PreviousState, + OUT PULONG ReturnLength ); @@ -357,21 +358,24 @@ ZwAllocateUuids( */ NTSTATUS STDCALL -NtAllocateVirtualMemory( +NtAllocateVirtualMemory ( IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN ULONG ZeroBits, IN OUT PULONG RegionSize, - IN ULONG AllocationType, + IN ULONG AllocationType, IN ULONG Protect ); -NTSTATUS STDCALL ZwAllocateVirtualMemory(IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG ZeroBits, - IN OUT PULONG RegionSize, - IN ULONG AllocationType, - IN ULONG Protect); +NTSTATUS +STDCALL +ZwAllocateVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN OUT PULONG RegionSize, + IN ULONG AllocationType, + IN ULONG Protect); /* * FUNCTION: Returns from a callback into user mode @@ -396,23 +400,23 @@ ZwCallbackReturn( * ARGUMENTS: * FileHandle = Handle to the file * IoStatusBlock = - + * * REMARKS: - * This function maps to the win32 CancelIo. + * This function maps to the win32 CancelIo. * RETURNS: Status */ NTSTATUS STDCALL NtCancelIoFile( IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock + OUT PIO_STATUS_BLOCK IoStatusBlock ); NTSTATUS STDCALL ZwCancelIoFile( IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock + OUT PIO_STATUS_BLOCK IoStatusBlock ); /* * FUNCTION: Cancels a timer @@ -447,8 +451,8 @@ ZwCancelTimer( NTSTATUS STDCALL -NtClearEvent( - IN HANDLE EventHandle +NtClearEvent( + IN HANDLE EventHandle ); NTSTATUS @@ -469,14 +473,14 @@ ZwClearEvent( NTSTATUS STDCALL NtClose( - IN HANDLE Handle - ); + IN HANDLE Handle + ); NTSTATUS STDCALL ZwClose( - IN HANDLE Handle - ); + IN HANDLE Handle + ); /* * FUNCTION: Generates an audit message when a handle to an object is dereferenced @@ -494,17 +498,17 @@ ZwClose( NTSTATUS STDCALL NtCloseObjectAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, - IN BOOLEAN GenerateOnClose + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN BOOLEAN GenerateOnClose ); NTSTATUS STDCALL ZwCloseObjectAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, - IN BOOLEAN GenerateOnClose + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN BOOLEAN GenerateOnClose ); @@ -545,18 +549,18 @@ NTSTATUS STDCALL ZwContinue(IN PCONTEXT Context, IN CINT IrqLevel); NTSTATUS STDCALL NtCreateDirectoryObject( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes - ); + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ); NTSTATUS STDCALL ZwCreateDirectoryObject( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes - ); + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ); /* * FUNCTION: Creates an event object @@ -637,38 +641,38 @@ ZwCreateEventPair( * REMARKS: This function maps to the win32 CreateFile. * RETURNS: Status */ - -NTSTATUS -STDCALL -NtCreateFile( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER AllocationSize OPTIONAL, - IN ULONG FileAttributes, - IN ULONG ShareAccess, - IN ULONG CreateDisposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength - ); -NTSTATUS -STDCALL -ZwCreateFile( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER AllocationSize OPTIONAL, - IN ULONG FileAttributes, - IN ULONG ShareAccess, - IN ULONG CreateDisposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength - ); +NTSTATUS +STDCALL +NtCreateFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength + ); + +NTSTATUS +STDCALL +ZwCreateFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength + ); /* * FUNCTION: Creates or opens a file, directory or device object. @@ -688,7 +692,7 @@ NtCreateIoCompletion( OUT PHANDLE CompletionPort, IN ACCESS_MASK DesiredAccess, OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG NumberOfConcurrentThreads + IN ULONG NumberOfConcurrentThreads ); NTSTATUS @@ -697,7 +701,7 @@ ZwCreateIoCompletion( OUT PHANDLE CompletionPort, IN ACCESS_MASK DesiredAccess, OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG NumberOfConcurrentThreads + IN ULONG NumberOfConcurrentThreads ); @@ -725,11 +729,11 @@ NtCreateMailslotFile( IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG FileAttributes, - IN ULONG ShareAccess, + IN ULONG FileAttributes, + IN ULONG ShareAccess, IN ULONG MaxMessageSize, IN PLARGE_INTEGER TimeOut - ); + ); NTSTATUS STDCALL @@ -738,11 +742,11 @@ ZwCreateMailslotFile( IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG FileAttributes, - IN ULONG ShareAccess, + IN ULONG FileAttributes, + IN ULONG ShareAccess, IN ULONG MaxMessageSize, IN PLARGE_INTEGER TimeOut - ); + ); /* * FUNCTION: Creates or opens a mutex @@ -800,39 +804,39 @@ NTSTATUS STDCALL NtCreateNamedPipeFile( OUT PHANDLE NamedPipeFileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG FileAttributes, IN ULONG ShareAccess, - IN ULONG OpenMode, - IN ULONG PipeType, - IN ULONG PipeRead, - IN ULONG PipeWait, + IN ULONG OpenMode, + IN ULONG PipeType, + IN ULONG PipeRead, + IN ULONG PipeWait, IN ULONG MaxInstances, IN ULONG InBufferSize, IN ULONG OutBufferSize, IN PLARGE_INTEGER TimeOut - ); + ); NTSTATUS STDCALL ZwCreateNamedPipeFile( OUT PHANDLE NamedPipeFileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG FileAttributes, IN ULONG ShareAccess, - IN ULONG OpenMode, - IN ULONG PipeType, - IN ULONG PipeRead, - IN ULONG PipeWait, + IN ULONG OpenMode, + IN ULONG PipeType, + IN ULONG PipeRead, + IN ULONG PipeWait, IN ULONG MaxInstances, IN ULONG InBufferSize, IN ULONG OutBufferSize, IN PLARGE_INTEGER TimeOut - ); + ); /* @@ -845,22 +849,22 @@ ZwCreateNamedPipeFile( * RETURNS: Status */ -NTSTATUS -STDCALL +NTSTATUS +STDCALL NtCreatePagingFile( IN PUNICODE_STRING PageFileName, IN ULONG MiniumSize, IN ULONG MaxiumSize, - OUT PULONG ActualSize + OUT PULONG ActualSize ); -NTSTATUS -STDCALL +NTSTATUS +STDCALL ZwCreatePagingFile( IN PUNICODE_STRING PageFileName, IN ULONG MiniumSize, IN ULONG MaxiumSize, - OUT PULONG ActualSize + OUT PULONG ActualSize ); /* @@ -874,9 +878,9 @@ ZwCreatePagingFile( * InheritObjectTable = Specifies to inherit the objects of the parent process if true. * SectionHandle = Handle to a section object to back the image file * DebugPort = Handle to a DebugPort if NULL the system default debug port will be used. - * ExceptionPort = Handle to a exception port. + * ExceptionPort = Handle to a exception port. * REMARKS: - * This function maps to the win32 CreateProcess. + * This function maps to the win32 CreateProcess. * RETURNS: Status */ NTSTATUS @@ -2366,18 +2370,18 @@ ZwOpenProcess ( NTSTATUS STDCALL -NtOpenProcessToken( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE TokenHandle +NtOpenProcessToken( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE TokenHandle ); NTSTATUS STDCALL -ZwOpenProcessToken( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE TokenHandle +ZwOpenProcessToken( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE TokenHandle ); /* @@ -2475,20 +2479,20 @@ ZwOpenThread( NTSTATUS STDCALL -NtOpenThreadToken( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - OUT PHANDLE TokenHandle +NtOpenThreadToken( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + OUT PHANDLE TokenHandle ); NTSTATUS STDCALL -ZwOpenThreadToken( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - OUT PHANDLE TokenHandle +ZwOpenThreadToken( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + OUT PHANDLE TokenHandle ); /* * FUNCTION: Opens an existing timer @@ -2504,14 +2508,14 @@ NtOpenTimer( OUT PHANDLE TimerHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes - ); + ); NTSTATUS STDCALL ZwOpenTimer( OUT PHANDLE TimerHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes - ); + ); /* * FUNCTION: Checks an access token for specific privileges @@ -2527,27 +2531,28 @@ ZwOpenTimer( NTSTATUS STDCALL NtPrivilegeCheck( - IN HANDLE ClientToken, - IN PPRIVILEGE_SET RequiredPrivileges, - IN PBOOLEAN Result + IN HANDLE ClientToken, + IN PPRIVILEGE_SET RequiredPrivileges, + IN PBOOLEAN Result ); + NTSTATUS STDCALL ZwPrivilegeCheck( - IN HANDLE ClientToken, - IN PPRIVILEGE_SET RequiredPrivileges, - IN PBOOLEAN Result + IN HANDLE ClientToken, + IN PPRIVILEGE_SET RequiredPrivileges, + IN PBOOLEAN Result ); NTSTATUS STDCALL NtPrivilegedServiceAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PUNICODE_STRING ServiceName, + IN PUNICODE_STRING SubsystemName, + IN PUNICODE_STRING ServiceName, IN HANDLE ClientToken, - IN PPRIVILEGE_SET Privileges, - IN BOOLEAN AccessGranted - ); + IN PPRIVILEGE_SET Privileges, + IN BOOLEAN AccessGranted + ); NTSTATUS STDCALL @@ -2563,34 +2568,36 @@ NTSTATUS STDCALL NtPrivilegeObjectAuditAlarm( IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, + IN PVOID HandleId, IN HANDLE ClientToken, IN ULONG DesiredAccess, IN PPRIVILEGE_SET Privileges, - IN BOOLEAN AccessGranted + IN BOOLEAN AccessGranted ); NTSTATUS STDCALL ZwPrivilegeObjectAuditAlarm( IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, + IN PVOID HandleId, IN HANDLE ClientToken, IN ULONG DesiredAccess, IN PPRIVILEGE_SET Privileges, - IN BOOLEAN AccessGranted + IN BOOLEAN AccessGranted ); /* * FUNCTION: Entry point for native applications * ARGUMENTS: - * Argument = Arguments passed to the application by the system [ at boot time ] + * Peb = Pointes to the Process Environment Block (PEB) * REMARKS: - * Native applications should use this function instead of a main. Calling proces should terminate itself. + * Native applications should use this function instead of a main. + * Calling proces should terminate itself. * RETURNS: Status */ -void NtProcessStartup( - IN PSTARTUP_ARGUMENT Argument +VOID +NtProcessStartup( + IN PPEB Peb ); /* @@ -2615,8 +2622,9 @@ NtProtectVirtualMemory( IN PVOID BaseAddress, IN ULONG NumberOfBytesToProtect, IN ULONG NewAccessProtection, - OUT PULONG OldAccessProtection + OUT PULONG OldAccessProtection ); + NTSTATUS STDCALL ZwProtectVirtualMemory( @@ -2624,7 +2632,7 @@ ZwProtectVirtualMemory( IN PVOID BaseAddress, IN ULONG NumberOfBytesToProtect, IN ULONG NewAccessProtection, - OUT PULONG OldAccessProtection + OUT PULONG OldAccessProtection ); @@ -2635,15 +2643,15 @@ ZwProtectVirtualMemory( * PulseCount = Number of times the action is repeated * RETURNS: Status */ -NTSTATUS -STDCALL +NTSTATUS +STDCALL NtPulseEvent( IN HANDLE EventHandle, IN PULONG PulseCount OPTIONAL ); -NTSTATUS -STDCALL +NTSTATUS +STDCALL ZwPulseEvent( IN HANDLE EventHandle, IN PULONG PulseCount OPTIONAL @@ -2741,29 +2749,29 @@ ZwQueryDirectoryFile( DataWritten = Actual size of the ObjectIndex ??? * RETURNS: Status */ -NTSTATUS -STDCALL +NTSTATUS +STDCALL NtQueryDirectoryObject( - IN HANDLE DirObjHandle, - OUT POBJDIR_INFORMATION DirObjInformation, - IN ULONG BufferLength, - IN BOOLEAN GetNextIndex, - IN BOOLEAN IgnoreInputIndex, - IN OUT PULONG ObjectIndex, - OUT PULONG DataWritten OPTIONAL - ); + IN HANDLE DirObjHandle, + OUT POBJDIR_INFORMATION DirObjInformation, + IN ULONG BufferLength, + IN BOOLEAN GetNextIndex, + IN BOOLEAN IgnoreInputIndex, + IN OUT PULONG ObjectIndex, + OUT PULONG DataWritten OPTIONAL + ); -NTSTATUS -STDCALL +NTSTATUS +STDCALL ZwQueryDirectoryObject( IN HANDLE DirObjHandle, - OUT POBJDIR_INFORMATION DirObjInformation, - IN ULONG BufferLength, - IN BOOLEAN GetNextIndex, - IN BOOLEAN IgnoreInputIndex, + OUT POBJDIR_INFORMATION DirObjInformation, + IN ULONG BufferLength, + IN BOOLEAN GetNextIndex, + IN BOOLEAN IgnoreInputIndex, IN OUT PULONG ObjectIndex, OUT PULONG DataWritten OPTIONAL - ); + ); /* * FUNCTION: Queries the extended attributes of a file @@ -2932,18 +2940,26 @@ NtQueryInformationAtom( GetFullPathName, GetFileType, GetFileSize, GetFileTime functions. * RETURNS: Status */ -NTSTATUS STDCALL NtQueryInformationFile(IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); +NTSTATUS +STDCALL +NtQueryInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + +NTSTATUS +STDCALL +ZwQueryInformationFile( + HANDLE FileHandle, + PIO_STATUS_BLOCK IoStatusBlock, + PVOID FileInformation, + ULONG Length, + FILE_INFORMATION_CLASS FileInformationClass + ); -NTSTATUS STDCALL ZwQueryInformationFile(HANDLE FileHandle, - PIO_STATUS_BLOCK IoStatusBlock, - PVOID FileInformation, - ULONG Length, - FILE_INFORMATION_CLASS FileInformationClass); - /* * FUNCTION: Queries the information of a process object. * ARGUMENTS: @@ -2986,9 +3002,6 @@ NTSTATUS STDCALL ZwQueryInformationFile(HANDLE FileHandle, * RETURNS: Status */ - - - NTSTATUS STDCALL NtQueryInformationProcess( @@ -3010,7 +3023,6 @@ ZwQueryInformationProcess( ); - /* * FUNCTION: Queries the information of a thread object. * ARGUMENTS: @@ -3056,24 +3068,25 @@ NtQueryInformationThread( OUT PULONG ReturnLength ); + NTSTATUS STDCALL -NtQueryInformationToken( - IN HANDLE TokenHandle, +NtQueryInformationToken( + IN HANDLE TokenHandle, IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation, - IN ULONG TokenInformationLength, - OUT PULONG ReturnLength + OUT PVOID TokenInformation, + IN ULONG TokenInformationLength, + OUT PULONG ReturnLength ); NTSTATUS STDCALL -ZwQueryInformationToken( - IN HANDLE TokenHandle, +ZwQueryInformationToken( + IN HANDLE TokenHandle, IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation, - IN ULONG TokenInformationLength, - OUT PULONG ReturnLength + OUT PVOID TokenInformation, + IN ULONG TokenInformationLength, + OUT PULONG ReturnLength ); /* @@ -3152,10 +3165,10 @@ ZwQueryKey( NTSTATUS STDCALL NtQueryMultipleValueKey( - HANDLE KeyHandle, - PVALENT ListOfValuesToQuery, - ULONG NumberOfItems, - PVOID MultipleValueInformation, + HANDLE KeyHandle, + PVALENT ListOfValuesToQuery, + ULONG NumberOfItems, + PVOID MultipleValueInformation, ULONG Length, PULONG ReturnLength ); @@ -3163,13 +3176,13 @@ NtQueryMultipleValueKey( NTSTATUS STDCALL ZwQueryMultipleValueKey( - HANDLE KeyHandle, - PVALENT ListOfValuesToQuery, - ULONG NumberOfItems, - PVOID MultipleValueInformation, + HANDLE KeyHandle, + PVALENT ListOfValuesToQuery, + ULONG NumberOfItems, + PVOID MultipleValueInformation, ULONG Length, PULONG ReturnLength -); +); /* * FUNCTION: Queries the information of a mutant object. @@ -3187,7 +3200,7 @@ NtQueryMutant( IN CINT MutantInformationClass, OUT PVOID MutantInformation, IN ULONG Length, - OUT PULONG ResultLength + OUT PULONG ResultLength ); NTSTATUS @@ -3197,7 +3210,7 @@ ZwQueryMutant( IN CINT MutantInformationClass, OUT PVOID MutantInformation, IN ULONG Length, - OUT PULONG ResultLength + OUT PULONG ResultLength ); /* * FUNCTION: Queries the information of a object. @@ -3224,6 +3237,7 @@ NtQueryObject( IN ULONG Length, OUT PULONG ResultLength ); + NTSTATUS STDCALL ZwQueryObject( @@ -3244,7 +3258,7 @@ ZwQueryObject( This procedure maps to the win32 QueryPerformanceCounter, QueryPerformanceFrequency * RETURNS: Status * -*/ +*/ NTSTATUS STDCALL NtQueryPerformanceCounter( @@ -3268,24 +3282,25 @@ ZwQueryPerformanceCounter( * ResultLength = Data written * RETURNS: Status * -*/ +*/ NTSTATUS STDCALL NtQuerySection( IN HANDLE SectionHandle, IN CINT SectionInformationClass, OUT PVOID SectionInformation, - IN ULONG Length, - OUT PULONG ResultLength + IN ULONG Length, + OUT PULONG ResultLength ); + NTSTATUS STDCALL ZwQuerySection( IN HANDLE SectionHandle, IN CINT SectionInformationClass, OUT PVOID SectionInformation, - IN ULONG Length, - OUT PULONG ResultLength + IN ULONG Length, + OUT PULONG ResultLength ); NTSTATUS @@ -3330,6 +3345,7 @@ NtQuerySemaphore( ULONG Length, PULONG ReturnLength ); + NTSTATUS STDCALL ZwQuerySemaphore( @@ -3348,20 +3364,20 @@ ZwQuerySemaphore( * DataWritten = size of the LinkName. * RETURNS: Status * -*/ +*/ NTSTATUS STDCALL NtQuerySymbolicLinkObject( IN HANDLE SymLinkObjHandle, - OUT PUNICODE_STRING LinkTarget, + OUT PUNICODE_STRING LinkTarget, OUT PULONG DataWritten OPTIONAL - ); + ); NTSTATUS STDCALL ZwQuerySymbolicLinkObject( IN HANDLE SymLinkObjHandle, - OUT PUNICODE_STRING LinkName, + OUT PUNICODE_STRING LinkName, OUT PULONG DataWritten OPTIONAL ); @@ -3375,17 +3391,18 @@ ZwQuerySymbolicLinkObject( * ReturnLength = data written * RETURNS: Status * -*/ +*/ NTSTATUS -STDCALL +STDCALL NtQuerySystemEnvironmentValue( IN PUNICODE_STRING Name, OUT PVOID Value, ULONG Length, PULONG ReturnLength ); + NTSTATUS -STDCALL +STDCALL ZwQuerySystemEnvironmentValue( IN PUNICODE_STRING Name, OUT PVOID Value, @@ -3408,7 +3425,7 @@ ZwQuerySystemEnvironmentValue( ResultLength = Data written * RETURNS: Status * -*/ +*/ NTSTATUS STDCALL NtQuerySystemInformation( @@ -3417,6 +3434,7 @@ NtQuerySystemInformation( IN ULONG Length, OUT PULONG ResultLength ); + NTSTATUS STDCALL ZwQuerySystemInformation( @@ -3432,7 +3450,7 @@ ZwQuerySystemInformation( * CurrentTime (OUT) = Caller should supply storage for the resulting time. * RETURNS: Status * -*/ +*/ NTSTATUS STDCALL @@ -3622,8 +3640,8 @@ ZwQueryVolumeInformationFile( OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PVOID FsInformation, IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass - ); + IN FS_INFORMATION_CLASS FsInformationClass + ); // draft // FIXME: Should I specify if the apc is user or kernel mode somewhere ?? /* @@ -3656,6 +3674,8 @@ ZwQueueApcThread( PVOID NormalContext, PVOID SystemArgument1, PVOID SystemArgument2); + + /* * FUNCTION: Raises an exception * ARGUMENTS: @@ -3664,8 +3684,7 @@ ZwQueueApcThread( * IsDebugger = * RETURNS: Status * -*/ - +*/ NTSTATUS STDCALL diff --git a/reactos/include/ddk/zwtypes.h b/reactos/include/ddk/zwtypes.h index 24f3e7aa6eb..336fc0fe581 100644 --- a/reactos/include/ddk/zwtypes.h +++ b/reactos/include/ddk/zwtypes.h @@ -44,9 +44,9 @@ typedef struct _LPC_MESSAGE //process query / set information class -#define ProcessBasicInformation 0 -#define ProcessQuotaLimits 1 -#define ProcessIoCounters 2 +#define ProcessBasicInformation 0 +#define ProcessQuotaLimits 1 +#define ProcessIoCounters 2 #define ProcessVmCounters 3 #define ProcessTimes 4 #define ProcessBasePriority 5 @@ -104,16 +104,15 @@ typedef struct _LPC_MESSAGE // system information -#define SystemPerformanceInformation 5 +#define SystemPerformanceInformation 5 #define SystemDriverInformation 11 #define SystemCacheInformation 21 #define SystemTimeAdjustmentInformation 28 - #define SystemTimeZoneInformation 44 // memory information -#define MemoryBasicInformation 0 +#define MemoryBasicInformation 0 // shutdown action @@ -130,17 +129,17 @@ typedef enum SHUTDOWN_ACTION_TAG { // number of wait objects -#define THREAD_WAIT_OBJECTS 3 -//#define MAXIMUM_WAIT_OBJECTS 64 +#define THREAD_WAIT_OBJECTS 3 +//#define MAXIMUM_WAIT_OBJECTS 64 // key restore flags -#define REG_WHOLE_HIVE_VOLATILE 1 -#define REG_REFRESH_HIVE 2 +#define REG_WHOLE_HIVE_VOLATILE 1 +#define REG_REFRESH_HIVE 2 // object type access rights -#define OBJECT_TYPE_CREATE 0x0001 +#define OBJECT_TYPE_CREATE 0x0001 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) // directory access rights @@ -154,9 +153,9 @@ typedef enum SHUTDOWN_ACTION_TAG { // symbolic link access rights -#define SYMBOLIC_LINK_QUERY 0x0001 +#define SYMBOLIC_LINK_QUERY 0x0001 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - + typedef struct _PROCESS_WS_WATCH_INFORMATION { PVOID FaultingPc; @@ -166,14 +165,14 @@ typedef struct _PROCESS_WS_WATCH_INFORMATION typedef struct _PROCESS_BASIC_INFORMATION { NTSTATUS ExitStatus; - PNT_PEB PebBaseAddress; + PPEB PebBaseAddress; KAFFINITY AffinityMask; KPRIORITY BasePriority; ULONG UniqueProcessId; ULONG InheritedFromUniqueProcessId; } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION; -typedef struct _QUOTA_LIMITS +typedef struct _QUOTA_LIMITS { ULONG PagedPoolLimit; ULONG NonPagedPoolLimit; @@ -194,7 +193,7 @@ typedef struct _IO_COUNTERS } IO_COUNTERS, *PIO_COUNTERS; -typedef struct _VM_COUNTERS_ +typedef struct _VM_COUNTERS_ { ULONG PeakVirtualSize; ULONG VirtualSize; @@ -210,7 +209,7 @@ typedef struct _VM_COUNTERS_ } VM_COUNTERS, *PVM_COUNTERS; -typedef struct _POOLED_USAGE_AND_LIMITS_ +typedef struct _POOLED_USAGE_AND_LIMITS_ { ULONG PeakPagedPoolUsage; ULONG PagedPoolUsage; @@ -224,13 +223,13 @@ typedef struct _POOLED_USAGE_AND_LIMITS_ } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS; -typedef struct _PROCESS_ACCESS_TOKEN +typedef struct _PROCESS_ACCESS_TOKEN { HANDLE Token; HANDLE Thread; } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN; -typedef struct _KERNEL_USER_TIMES +typedef struct _KERNEL_USER_TIMES { TIME CreateTime; TIME ExitTime; @@ -253,22 +252,22 @@ typedef struct _THREAD_BASIC_INFORMATION } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION; // object information - -typedef struct _OBJECT_NAME_INFORMATION -{ - UNICODE_STRING Name; -} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; + +typedef struct _OBJECT_NAME_INFORMATION +{ + UNICODE_STRING Name; +} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; -typedef struct _OBJECT_DATA_INFORMATION +typedef struct _OBJECT_DATA_INFORMATION { BOOLEAN bInheritHandle; BOOLEAN bProtectFromClose; -} OBJECT_DATA_INFORMATION, *POBJECT_DATA_INFORMATION; +} OBJECT_DATA_INFORMATION, *POBJECT_DATA_INFORMATION; -typedef struct _OBJECT_TYPE_INFORMATION +typedef struct _OBJECT_TYPE_INFORMATION { UNICODE_STRING Name; UNICODE_STRING Type; @@ -300,9 +299,9 @@ typedef struct _SYSTEM_TIME_ADJUSTMENT ULONG TimeAdjustment; BOOL TimeAdjustmentDisabled; } SYSTEM_TIME_ADJUSTMENT, *PSYSTEM_TIME_ADJUSTMENT; - -typedef struct _SYSTEM_CONFIGURATION_INFO { - union { + +typedef struct _SYSTEM_CONFIGURATION_INFO { + union { ULONG OemId; struct { WORD ProcessorArchitecture; @@ -321,56 +320,58 @@ typedef struct _SYSTEM_CONFIGURATION_INFO { } SYSTEM_CONFIGURATION_INFO, *PSYSTEM_CONFIGURATION_INFO; -typedef struct _SYSTEM_CACHE_INFORMATION { - ULONG CurrentSize; - ULONG PeakSize; - ULONG PageFaultCount; - ULONG MinimumWorkingSet; - ULONG MaximumWorkingSet; - ULONG Unused[4]; +typedef struct _SYSTEM_CACHE_INFORMATION +{ + ULONG CurrentSize; + ULONG PeakSize; + ULONG PageFaultCount; + ULONG MinimumWorkingSet; + ULONG MaximumWorkingSet; + ULONG Unused[4]; } SYSTEM_CACHE_INFORMATION; // file information -typedef struct _FILE_BASIC_INFORMATION -{ - TIME CreationTime; - TIME LastAccessTime; - TIME LastWriteTime; - TIME ChangeTime; - ULONG FileAttributes; -} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; - -typedef struct _FILE_STANDARD_INFORMATION -{ - LARGE_INTEGER AllocationSize; - LARGE_INTEGER EndOfFile; - ULONG NumberOfLinks; - BOOLEAN DeletePending; - BOOLEAN Directory; +typedef struct _FILE_BASIC_INFORMATION +{ + TIME CreationTime; + TIME LastAccessTime; + TIME LastWriteTime; + TIME ChangeTime; + ULONG FileAttributes; +} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; + +typedef struct _FILE_STANDARD_INFORMATION +{ + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG NumberOfLinks; + BOOLEAN DeletePending; + BOOLEAN Directory; } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; - -typedef struct _FILE_POSITION_INFORMATION -{ - LARGE_INTEGER CurrentByteOffset; -} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; - -typedef struct _FILE_ALIGNMENT_INFORMATION -{ - ULONG AlignmentRequirement; -} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; - + +typedef struct _FILE_POSITION_INFORMATION +{ + LARGE_INTEGER CurrentByteOffset; +} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; + +typedef struct _FILE_ALIGNMENT_INFORMATION +{ + ULONG AlignmentRequirement; +} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; + typedef struct _FILE_DISPOSITION_INFORMATION -{ - BOOLEAN DeleteFile; -} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; - +{ + BOOLEAN DeleteFile; +} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; + typedef struct _FILE_END_OF_FILE_INFORMATION -{ - LARGE_INTEGER EndOfFile; -} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; - -typedef struct _FILE_NETWORK_OPEN_INFORMATION { +{ + LARGE_INTEGER EndOfFile; +} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; + +typedef struct _FILE_NETWORK_OPEN_INFORMATION +{ TIME CreationTime; TIME LastAccessTime; TIME LastWriteTime; @@ -402,11 +403,11 @@ typedef struct _FILE_GET_EA_INFORMATION { } FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION; typedef struct _FILE_STREAM_INFORMATION { - ULONG NextEntryOffset; - ULONG StreamNameLength; - LARGE_INTEGER StreamSize; - LARGE_INTEGER StreamAllocationSize; - WCHAR StreamName[0]; + ULONG NextEntryOffset; + ULONG StreamNameLength; + LARGE_INTEGER StreamSize; + LARGE_INTEGER StreamAllocationSize; + WCHAR StreamName[0]; } FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION; typedef struct _FILE_ALLOCATION_INFORMATION { @@ -430,7 +431,7 @@ typedef struct _FILE_NAMES_INFORMATION typedef struct _FILE_RENAME_INFORMATION { BOOLEAN Replace; HANDLE RootDir; - ULONG FileNameLength; + ULONG FileNameLength; WCHAR FileName[0]; } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION; @@ -471,9 +472,9 @@ typedef struct _FILE_ALL_INFORMATION { // file system information structures -typedef struct _FILE_FS_DEVICE_INFORMATION { - DEVICE_TYPE DeviceType; - ULONG Characteristics; +typedef struct _FILE_FS_DEVICE_INFORMATION { + DEVICE_TYPE DeviceType; + ULONG Characteristics; } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION; @@ -496,13 +497,13 @@ typedef struct _FILE_FS_ATTRIBUTE_INFORMATION { ULONG FileSystemAttributes; LONG MaximumComponentNameLength; ULONG FileSystemNameLength; - WCHAR FileSystemName[0]; + WCHAR FileSystemName[0]; } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION; /* FileSystemAttributes is one of the following values: - FILE_CASE_SENSITIVE_SEARCH 0x00000001 + FILE_CASE_SENSITIVE_SEARCH 0x00000001 FILE_CASE_PRESERVED_NAMES 0x00000002 FILE_UNICODE_ON_DISK 0x00000004 FILE_PERSISTENT_ACLS 0x00000008 @@ -518,17 +519,17 @@ typedef struct _FILE_FS_LABEL_INFORMATION { // read file scatter / write file scatter //FIXME I am a win32 struct aswell -typedef union _FILE_SEGMENT_ELEMENT { - PVOID Buffer; - ULONG Alignment; -}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; +typedef union _FILE_SEGMENT_ELEMENT { + PVOID Buffer; + ULONG Alignment; +}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; // directory information typedef struct _OBJDIR_INFORMATION { UNICODE_STRING ObjectName; UNICODE_STRING ObjectTypeName; // Directory, Device ... - UCHAR Data[0]; + UCHAR Data[0]; } OBJDIR_INFORMATION, *POBJDIR_INFORMATION; @@ -622,28 +623,14 @@ typedef struct _FILE_NOTIFY_INFORMATION { */ -//FIXME: I am a win32 object -typedef -VOID -(*PTIMERAPCROUTINE)( - LPVOID lpArgToCompletionRoutine, - DWORD dwTimerLowValue, - DWORD dwTimerHighValue - ); - -// NtProcessStartup parameters - -typedef struct _ENVIRONMENT_INFORMATION { - ULONG Unknown[21]; - UNICODE_STRING CommandLine; - UNICODE_STRING ImageFile; -} ENVIRONMENT_INFORMATION, *PENVIRONMENT_INFORMATION; - - -typedef struct _STARTUP_ARGUMENT { - ULONG Unknown[3]; - PENVIRONMENT_INFORMATION Environment; -} STARTUP_ARGUMENT, *PSTARTUP_ARGUMENT; +//FIXME: I am a win32 object +typedef +VOID +(*PTIMERAPCROUTINE)( + LPVOID lpArgToCompletionRoutine, + DWORD dwTimerLowValue, + DWORD dwTimerHighValue + ); // File System Control commands ( related to defragging ) @@ -653,7 +640,7 @@ typedef struct _STARTUP_ARGUMENT { #define FSCTL_GET_RETRIEVAL_POINTERS 0x90073 #define FSCTL_MOVE_FILE 0x90074 -typedef struct _MAPPING_PAIR +typedef struct _MAPPING_PAIR { ULONGLONG Vcn; ULONGLONG Lcn; @@ -670,17 +657,17 @@ typedef struct _BITMAP_DESCRIPTOR { ULONGLONG StartLcn; ULONGLONG ClustersToEndOfVol; - BYTE Map[0]; // variable size -} BITMAP_DESCRIPTOR, *PBITMAP_DESCRIPTOR; + BYTE Map[0]; // variable size +} BITMAP_DESCRIPTOR, *PBITMAP_DESCRIPTOR; typedef struct _MOVEFILE_DESCRIPTOR { - HANDLE FileHandle; - ULONG Reserved; - LARGE_INTEGER StartVcn; + HANDLE FileHandle; + ULONG Reserved; + LARGE_INTEGER StartVcn; LARGE_INTEGER TargetLcn; - ULONG NumVcns; - ULONG Reserved1; + ULONG NumVcns; + ULONG Reserved1; } MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR; @@ -694,7 +681,7 @@ typedef struct _SEMAPHORE_BASIC_INFORMATION // event information -typedef struct _EVENT_BASIC_INFORMATION +typedef struct _EVENT_BASIC_INFORMATION { BOOL AutomaticReset; BOOL Signaled; @@ -706,7 +693,7 @@ typedef struct _EVENT_BASIC_INFORMATION // SynchronizationTimer //} TIMER_TYPE; -typedef +typedef struct _LPC_PORT_BASIC_INFORMATION { DWORD Unknown0; diff --git a/reactos/include/internal/teb.h b/reactos/include/internal/teb.h index b252dd9b560..fd0483965da 100644 --- a/reactos/include/internal/teb.h +++ b/reactos/include/internal/teb.h @@ -7,6 +7,6 @@ #define PEB_BASE (0xb0001000) #define PEB_STARTUPINFO (0xb0003000) -#define NtCurrentPeb() ((PNT_PEB)PEB_BASE) +#define NtCurrentPeb() ((PPEB)PEB_BASE) #endif /* __INCLUDE_INTERNAL_TEB */ diff --git a/reactos/include/ntdll/rtl.h b/reactos/include/ntdll/rtl.h index 60ec3d5f169..58311c891d1 100644 --- a/reactos/include/ntdll/rtl.h +++ b/reactos/include/ntdll/rtl.h @@ -1,4 +1,4 @@ -/* $Id: rtl.h,v 1.4 1999/12/01 15:16:56 ekohl Exp $ +/* $Id: rtl.h,v 1.5 1999/12/06 00:16:33 ekohl Exp $ * */ @@ -109,32 +109,17 @@ RtlCreateUserThread ( IN OUT PCLIENT_ID ClientId ); - -VOID -STDCALL -RtlDeNormalizeProcessParams ( - IN OUT PSTARTUP_ARGUMENT pArgument - ); - -VOID -STDCALL -RtlDestroyProcessParameters ( - IN OUT PSTARTUP_ARGUMENT pArgument - ); - -VOID -STDCALL -RtlNormalizeProcessParams ( - IN OUT PSTARTUP_ARGUMENT pArgument - ); - - -/* Preliminary prototype!! */ - +/* + * Preliminary prototype!! + * + * This prototype is not finished yet. It will change in the future. + */ NTSTATUS STDCALL RtlCreateUserProcess ( - PUNICODE_STRING ApplicationName, + PUNICODE_STRING CommandLine, + ULONG Unknown1, + PPPB Ppb, PSECURITY_DESCRIPTOR ProcessSd, PSECURITY_DESCRIPTOR ThreadSd, WINBOOL bInheritHandles, @@ -144,5 +129,37 @@ RtlCreateUserProcess ( PHANDLE ThreadHandle ); +NTSTATUS +STDCALL +RtlCreateProcessParameters ( + IN OUT PPPB *Ppb, + IN PUNICODE_STRING CommandLine, + IN PUNICODE_STRING LibraryPath, + IN PUNICODE_STRING CurrentDirectory, + IN PUNICODE_STRING ImageName, + IN PVOID Environment, + IN PUNICODE_STRING Title, + IN PUNICODE_STRING Desktop, + IN PUNICODE_STRING Reserved, + IN PVOID Reserved2 + ); + +VOID +STDCALL +RtlDeNormalizeProcessParams ( + IN OUT PPPB Ppb + ); + +VOID +STDCALL +RtlDestroyProcessParameters ( + IN OUT PPPB Ppb + ); + +VOID +STDCALL +RtlNormalizeProcessParams ( + IN OUT PPPB Ppb + ); /* EOF */ \ No newline at end of file diff --git a/reactos/lib/kernel32/process/cmdline.c b/reactos/lib/kernel32/process/cmdline.c index 3f5cf16265d..9412f6a9ead 100644 --- a/reactos/lib/kernel32/process/cmdline.c +++ b/reactos/lib/kernel32/process/cmdline.c @@ -39,8 +39,8 @@ LPSTR STDCALL GetCommandLineA(VOID) return(CommandLineA); } -LPWSTR STDCALL GetCommandLineW(VOID) +LPWSTR STDCALL GetCommandLineW (VOID) { - return(NtCurrentPeb()->ProcessInfo->CommandLine); + return (NtCurrentPeb()->Ppb->CommandLine.Buffer); } diff --git a/reactos/lib/kernel32/process/create.c b/reactos/lib/kernel32/process/create.c index 42ebe71fde4..3d0b45a20c9 100644 --- a/reactos/lib/kernel32/process/create.c +++ b/reactos/lib/kernel32/process/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.13 1999/11/24 11:51:45 dwelch Exp $ +/* $Id: create.c,v 1.14 1999/12/06 00:23:40 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -23,6 +23,7 @@ #include #include #include +#include #define NDEBUG #include @@ -123,14 +124,13 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle, lpThreadAttributes->lpSecurityDescriptor; } ObjectAttributes.SecurityQualityOfService = NULL; - + if ((dwCreationFlags & CREATE_SUSPENDED) == CREATE_SUSPENDED) CreateSuspended = TRUE; else CreateSuspended = FALSE; - - - + + BaseAddress = (PVOID)(STACK_TOP - dwStackSize); Status = NtAllocateVirtualMemory(ProcessHandle, &BaseAddress, @@ -153,9 +153,9 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle, ThreadContext.SegSs = USER_DS; ThreadContext.Esp = STACK_TOP - 16; ThreadContext.EFlags = (1<<1) + (1<<9); - + DPRINT("ThreadContext.Eip %x\n",ThreadContext.Eip); - + NtDuplicateObject(NtCurrentProcess(), &SectionHandle, ProcessHandle, @@ -187,7 +187,7 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle, sizeof(DupSectionHandle), &BytesWritten); - + Status = NtCreateThread(&ThreadHandle, THREAD_ALL_ACCESS, &ObjectAttributes, @@ -198,7 +198,7 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle, CreateSuspended); if ( lpThreadId != NULL ) memcpy(lpThreadId, &ClientId.UniqueThread,sizeof(ULONG)); - + return ThreadHandle; } @@ -222,10 +222,10 @@ HANDLE KERNEL32_MapFile(LPCWSTR lpApplicationName, DWORD len = 0; hFile = NULL; - + /* * Find the application name - */ + */ TempApplicationName[0] = '\\'; TempApplicationName[1] = '?'; TempApplicationName[2] = '?'; @@ -233,7 +233,7 @@ HANDLE KERNEL32_MapFile(LPCWSTR lpApplicationName, TempApplicationName[4] = 0; DPRINT("TempApplicationName '%w'\n",TempApplicationName); - + if (lpApplicationName != NULL) { wcscpy(TempFileName, lpApplicationName); @@ -241,7 +241,7 @@ HANDLE KERNEL32_MapFile(LPCWSTR lpApplicationName, DPRINT("TempFileName '%w'\n",TempFileName); } else - { + { wcscpy(TempFileName, lpCommandLine); DPRINT("TempFileName '%w'\n",TempFileName); @@ -261,11 +261,11 @@ HANDLE KERNEL32_MapFile(LPCWSTR lpApplicationName, wcscat(TempApplicationName,TempDirectoryName); } wcscat(TempApplicationName,TempFileName); - + RtlInitUnicodeString(&ApplicationNameString, TempApplicationName); - + DPRINT("ApplicationName %w\n",ApplicationNameString.Buffer); - + InitializeObjectAttributes(&ObjectAttributes, &ApplicationNameString, OBJ_CASE_INSENSITIVE, @@ -275,20 +275,20 @@ HANDLE KERNEL32_MapFile(LPCWSTR lpApplicationName, /* * 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); - + if (!NT_SUCCESS(Status)) { SetLastError(RtlNtStatusToDosError(Status)); return(NULL); } - + Status = NtReadFile(hFile, NULL, NULL, @@ -303,7 +303,7 @@ HANDLE KERNEL32_MapFile(LPCWSTR lpApplicationName, SetLastError(RtlNtStatusToDosError(Status)); return(NULL); } - + FileOffset.u.LowPart = DosHeader->e_lfanew; FileOffset.u.HighPart = 0; @@ -319,10 +319,10 @@ HANDLE KERNEL32_MapFile(LPCWSTR lpApplicationName, if (!NT_SUCCESS(Status)) { SetLastError(RtlNtStatusToDosError(Status)); - return(NULL); + return(NULL); } - + Status = NtCreateSection(&hSection, SECTION_ALL_ACCESS, NULL, @@ -332,25 +332,27 @@ HANDLE KERNEL32_MapFile(LPCWSTR lpApplicationName, hFile); NtClose(hFile); - if (!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { SetLastError(RtlNtStatusToDosError(Status)); return(NULL); } - + return(hSection); } -static NTSTATUS CreatePeb(HANDLE ProcessHandle, PWSTR CommandLine) +static NTSTATUS +CreatePeb ( + HANDLE ProcessHandle, + PPPB Ppb) { NTSTATUS Status; PVOID PebBase; ULONG PebSize; - NT_PEB Peb; + PEB Peb; + PVOID PpbBase; + ULONG PpbSize; ULONG BytesWritten; - PVOID ProcessInfoBase; - ULONG ProcessInfoSize; - PROCESSINFO ProcessInfo; PebBase = (PVOID)PEB_BASE; PebSize = 0x1000; @@ -361,7 +363,7 @@ static NTSTATUS CreatePeb(HANDLE ProcessHandle, PWSTR CommandLine) sizeof(Peb), &BytesWritten); - Peb.ProcessInfo = (PPROCESSINFO)PEB_STARTUPINFO; + Peb.Ppb = (PPPB)PEB_STARTUPINFO; NtWriteVirtualMemory(ProcessHandle, (PVOID)PEB_BASE, @@ -369,12 +371,12 @@ static NTSTATUS CreatePeb(HANDLE ProcessHandle, PWSTR CommandLine) sizeof(Peb), &BytesWritten); - ProcessInfoBase = (PVOID)PEB_STARTUPINFO; - ProcessInfoSize = 0x1000; + PpbBase = (PVOID)PEB_STARTUPINFO; + PpbSize = Ppb->TotalSize; Status = NtAllocateVirtualMemory(ProcessHandle, - &ProcessInfoBase, + &PpbBase, 0, - &ProcessInfoSize, + &PpbSize, MEM_COMMIT, PAGE_READWRITE); if (!NT_SUCCESS(Status)) @@ -382,30 +384,30 @@ static NTSTATUS CreatePeb(HANDLE ProcessHandle, PWSTR CommandLine) return(Status); } - memset(&ProcessInfo, 0, sizeof(PROCESSINFO)); - wcscpy(ProcessInfo.CommandLine, CommandLine); - - DPRINT("ProcessInfoSize %x\n",ProcessInfoSize); + DPRINT("Ppb size %x\n", Ppb->TotalSize); ZwWriteVirtualMemory(ProcessHandle, (PVOID)PEB_STARTUPINFO, - &ProcessInfo, - ProcessInfoSize, + &Ppb, + Ppb->TotalSize, &BytesWritten); return(STATUS_SUCCESS); } -WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName, - LPWSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - WINBOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCWSTR lpCurrentDirectory, - LPSTARTUPINFOW lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation) +WINBOOL +STDCALL +CreateProcessW ( + LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + WINBOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation) { HANDLE hSection, hProcess, hThread; NTSTATUS Status; @@ -421,7 +423,9 @@ WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName, PROCESS_BASIC_INFORMATION ProcessBasicInfo; ULONG retlen; DWORD len = 0; - + PPPB Ppb; + UNICODE_STRING CommandLine_U; + DPRINT("CreateProcessW(lpApplicationName '%w', lpCommandLine '%w')\n", lpApplicationName,lpCommandLine); @@ -443,15 +447,31 @@ WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName, wcscat(TempCommandLine, L" "); wcscat(TempCommandLine, lpCommandLine); } - - - hSection = KERNEL32_MapFile(lpApplicationName, - lpCommandLine, - &Headers, - &DosHeader); - + + RtlInitUnicodeString ( + &CommandLine_U, + TempCommandLine); + + RtlCreateProcessParameters ( + &Ppb, + &CommandLine_U, + NULL, + NULL, + NULL, + lpEnvironment, + NULL, + NULL, + NULL, + NULL); + + hSection = KERNEL32_MapFile ( + lpApplicationName, + lpCommandLine, + &Headers, + &DosHeader); + Status = NtCreateProcess(&hProcess, - PROCESS_ALL_ACCESS, + PROCESS_ALL_ACCESS, NULL, NtCurrentProcess(), bInheritHandles, @@ -466,16 +486,16 @@ WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName, DPRINT("ProcessBasicInfo.UniqueProcessId %d\n", ProcessBasicInfo.UniqueProcessId); lpProcessInformation->dwProcessId = ProcessBasicInfo.UniqueProcessId; - + /* * Map NT DLL into the process */ Status = LdrMapNTDllForProcess(hProcess, &NTDllSection); - - InitialViewSize = DosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS) + + InitialViewSize = DosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * Headers.FileHeader.NumberOfSections; - + BaseAddress = (PVOID)Headers.OptionalHeader.ImageBase; SectionOffset.QuadPart = 0; Status = NtMapViewOfSection(hSection, @@ -490,6 +510,7 @@ WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName, PAGE_READWRITE); if (!NT_SUCCESS(Status)) { + RtlDestroyProcessParameters (Ppb); SetLastError(RtlNtStatusToDosError(Status)); return FALSE; } @@ -498,18 +519,20 @@ WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName, * Create Process Environment Block */ DPRINT("Creating peb\n"); - CreatePeb(hProcess, TempCommandLine); + CreatePeb(hProcess, Ppb); + + RtlDestroyProcessParameters (Ppb); DPRINT("Creating thread for process\n"); lpStartAddress = (LPTHREAD_START_ROUTINE) ((PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(NTDLL_BASE))-> AddressOfEntryPoint + ((PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(NTDLL_BASE))->ImageBase; - hThread = CreateFirstThread(hProcess, + hThread = CreateFirstThread(hProcess, lpThreadAttributes, Headers.OptionalHeader.SizeOfStackReserve, - lpStartAddress, - lpParameter, + lpStartAddress, + lpParameter, dwCreationFlags, &lpProcessInformation->dwThreadId, TempCommandLine, diff --git a/reactos/lib/kernel32/process/proc.c b/reactos/lib/kernel32/process/proc.c index 00714a72c1c..e84091fdcf3 100644 --- a/reactos/lib/kernel32/process/proc.c +++ b/reactos/lib/kernel32/process/proc.c @@ -1,4 +1,4 @@ -/* $Id: proc.c,v 1.23 1999/10/18 21:50:11 ariadne Exp $ +/* $Id: proc.c,v 1.24 1999/12/06 00:23:40 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -11,7 +11,6 @@ /* INCLUDES ****************************************************************/ -//#define UNICODE #include #include #include @@ -327,10 +326,10 @@ SleepEx ( VOID STDCALL GetStartupInfoW ( - LPSTARTUPINFOW lpStartupInfo + LPSTARTUPINFOW lpStartupInfo ) { - NT_PEB *pPeb = NtCurrentPeb(); + PPEB pPeb = NtCurrentPeb(); if (lpStartupInfo == NULL) { @@ -339,34 +338,34 @@ GetStartupInfoW ( } lpStartupInfo->cb = sizeof(STARTUPINFOW); -// lstrcpyW(lpStartupInfo->lpDesktop, pPeb->ProcessInfo->Desktop); -// lstrcpyW(lpStartupInfo->lpTitle, pPeb->ProcessInfo->Title); - lpStartupInfo->dwX = pPeb->ProcessInfo->dwX; - lpStartupInfo->dwY = pPeb->ProcessInfo->dwY; - lpStartupInfo->dwXSize = pPeb->ProcessInfo->dwXSize; - lpStartupInfo->dwYSize = pPeb->ProcessInfo->dwYSize; - lpStartupInfo->dwXCountChars = pPeb->ProcessInfo->dwXCountChars; - lpStartupInfo->dwYCountChars = pPeb->ProcessInfo->dwYCountChars; - lpStartupInfo->dwFillAttribute = pPeb->ProcessInfo->dwFillAttribute; - lpStartupInfo->dwFlags = pPeb->ProcessInfo->dwFlags; - lpStartupInfo->wShowWindow = pPeb->ProcessInfo->wShowWindow; -// lpStartupInfo->cbReserved2 = pPeb->ProcessInfo->cbReserved; -// lpStartupInfo->lpReserved = pPeb->ProcessInfo->lpReserved1; -// lpStartupInfo->lpReserved2 = pPeb->ProcessInfo->lpReserved2; +// lstrcpyW(lpStartupInfo->lpDesktop, pPeb->Ppb->Desktop); +// lstrcpyW(lpStartupInfo->lpTitle, pPeb->Ppb->Title); + lpStartupInfo->dwX = pPeb->Ppb->X; + lpStartupInfo->dwY = pPeb->Ppb->Y; + lpStartupInfo->dwXSize = pPeb->Ppb->XSize; + lpStartupInfo->dwYSize = pPeb->Ppb->YSize; + lpStartupInfo->dwXCountChars = pPeb->Ppb->XCountChars; + lpStartupInfo->dwYCountChars = pPeb->Ppb->YCountChars; + lpStartupInfo->dwFillAttribute = pPeb->Ppb->FillAttribute; + lpStartupInfo->dwFlags = pPeb->Ppb->Flags; + lpStartupInfo->wShowWindow = pPeb->Ppb->ShowWindow; +// lpStartupInfo->lpReserved = pPeb->Ppb->lpReserved1; +// lpStartupInfo->cbReserved2 = pPeb->Ppb->cbReserved; +// lpStartupInfo->lpReserved2 = pPeb->Ppb->lpReserved2; - lpStartupInfo->hStdInput = pPeb->ProcessInfo->hStdInput; - lpStartupInfo->hStdOutput = pPeb->ProcessInfo->hStdOutput; - lpStartupInfo->hStdError = pPeb->ProcessInfo->hStdError; + lpStartupInfo->hStdInput = pPeb->Ppb->InputHandle; + lpStartupInfo->hStdOutput = pPeb->Ppb->OutputHandle; + lpStartupInfo->hStdError = pPeb->Ppb->ErrorHandle; } VOID STDCALL GetStartupInfoA ( - LPSTARTUPINFOA lpStartupInfo + LPSTARTUPINFOA lpStartupInfo ) { - NT_PEB *pPeb = NtCurrentPeb(); + PPEB pPeb = NtCurrentPeb(); ULONG i = 0; if (lpStartupInfo == NULL) @@ -376,40 +375,40 @@ GetStartupInfoA ( } lpStartupInfo->cb = sizeof(STARTUPINFOA); - +#if 0 i = 0; - while ((pPeb->ProcessInfo->Desktop[i])!=0 && i < MAX_PATH) + while ((pPeb->Ppb->Desktop[i])!=0 && i < MAX_PATH) { lpStartupInfo->lpDesktop[i] = (unsigned char) - pPeb->ProcessInfo->Desktop[i]; + pPeb->Ppb->Desktop[i]; i++; } lpStartupInfo->lpDesktop[i] = 0; i = 0; - while ((pPeb->ProcessInfo->Title[i])!=0 && i < MAX_PATH) + while ((pPeb->Ppb->Title[i])!=0 && i < MAX_PATH) { - lpStartupInfo->lpTitle[i] = (unsigned char)pPeb->ProcessInfo->Title[i]; + lpStartupInfo->lpTitle[i] = (unsigned char)pPeb->ProcessParameters->Title[i]; i++; } lpStartupInfo->lpTitle[i] = 0; +#endif + lpStartupInfo->dwX = pPeb->Ppb->X; + lpStartupInfo->dwY = pPeb->Ppb->Y; + lpStartupInfo->dwXSize = pPeb->Ppb->XSize; + lpStartupInfo->dwYSize = pPeb->Ppb->YSize; + lpStartupInfo->dwXCountChars = pPeb->Ppb->XCountChars; + lpStartupInfo->dwYCountChars = pPeb->Ppb->YCountChars; + lpStartupInfo->dwFillAttribute = pPeb->Ppb->FillAttribute; + lpStartupInfo->dwFlags = pPeb->Ppb->Flags; + lpStartupInfo->wShowWindow = pPeb->Ppb->ShowWindow; +// lpStartupInfo->cbReserved2 = pPeb->Ppb->cbReserved; +// lpStartupInfo->lpReserved = pPeb->Ppb->lpReserved1; +// lpStartupInfo->lpReserved2 = pPeb->Ppb->lpReserved2; - lpStartupInfo->dwX = pPeb->ProcessInfo->dwX; - lpStartupInfo->dwY = pPeb->ProcessInfo->dwY; - lpStartupInfo->dwXSize = pPeb->ProcessInfo->dwXSize; - lpStartupInfo->dwYSize = pPeb->ProcessInfo->dwYSize; - lpStartupInfo->dwXCountChars = pPeb->ProcessInfo->dwXCountChars; - lpStartupInfo->dwYCountChars = pPeb->ProcessInfo->dwYCountChars; - lpStartupInfo->dwFillAttribute = pPeb->ProcessInfo->dwFillAttribute; - lpStartupInfo->dwFlags = pPeb->ProcessInfo->dwFlags; - lpStartupInfo->wShowWindow = pPeb->ProcessInfo->wShowWindow; -// lpStartupInfo->cbReserved2 = pPeb->ProcessInfo->cbReserved; -// lpStartupInfo->lpReserved = pPeb->ProcessInfo->lpReserved1; -// lpStartupInfo->lpReserved2 = pPeb->ProcessInfo->lpReserved2; - - lpStartupInfo->hStdInput = pPeb->ProcessInfo->hStdInput; - lpStartupInfo->hStdOutput = pPeb->ProcessInfo->hStdOutput; - lpStartupInfo->hStdError = pPeb->ProcessInfo->hStdError; + lpStartupInfo->hStdInput = pPeb->Ppb->InputHandle; + lpStartupInfo->hStdOutput = pPeb->Ppb->OutputHandle; + lpStartupInfo->hStdError = pPeb->Ppb->ErrorHandle; } diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index 7e878c14d51..34baa8c13e8 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.27 1999/12/04 21:03:22 ea Exp $ +; $Id: ntdll.def,v 1.28 1999/12/06 00:22:00 ekohl Exp $ ; ; ReactOS Operating System ; @@ -440,9 +440,10 @@ RtlAppendUnicodeToString@12 RtlCharToInteger@12 RtlCreateEnvironment@8 RtlCreateHeap@24 +RtlCreateProcessParameters@40 RtlCreateUnicodeString@8 RtlCreateUnicodeStringFromAsciiz@8 -RtlCreateUserProcess@32 +RtlCreateUserProcess@40 RtlCreateUserThread@40 RtlCompactHeap@8 RtlCompareString@12 @@ -451,8 +452,10 @@ RtlConvertLongToLargeInteger@4 RtlConvertUlongToLargeInteger@4 RtlCopyString@8 RtlCopyUnicodeString@8 +RtlDeNormalizeProcessParams@4 RtlDestroyEnvironment@4 RtlDestroyHeap@4 +RtlDestroyProcessParameters@4 RtlDowncaseUnicodeString@12 RtlEnlargedIntegerMultiply@8 RtlEnlargedUnsignedDivide@16 @@ -486,6 +489,7 @@ RtlLengthSecurityDescriptor RtlLockHeap@4 RtlMoveMemory@12 RtlMultiByteToUnicodeN@20 +RtlNormalizeProcessParams@4 RtlNtStatusToDosError RtlNtStatusToPsxErrno@4 RtlOemStringToUnicodeSize@4 @@ -494,6 +498,7 @@ RtlOemToUnicodeN@20 RtlQueryEnvironmentVariable_U@12 RtlReAllocateHeap@16 RtlReleasePebLock@0 +RtlSetCurrentEnvironment@8 RtlSetEnvironmentVariable@12 RtlSizeHeap@12 RtlUnlockHeap@4 diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index c71faa3fde1..cab8686c19c 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.17 1999/12/04 21:03:22 ea Exp $ +; $Id: ntdll.edf,v 1.18 1999/12/06 00:22:00 ekohl Exp $ ; ; ReactOS Operating System ; @@ -438,9 +438,10 @@ RtlAppendUnicodeToString=RtlAppendUnicodeToString@8 RtlCharToInteger=RtlCharToInteger@12 RtlCreateEnvironment=RtlCreateEnvironment@8 RtlCreateHeap=RtlCreateHeap@24 +RtlCreateProcessParameters=RtlCreateProcessParameters@40 RtlCreateUnicodeString=RtlCreateUnicodeString@8 RtlCreateUnicodeStringFromAsciiz=RtlCreateUnicodeStringFromAsciiz@8 -RtlCreateUserProcess=RtlCreateUserProcess@32 +RtlCreateUserProcess=RtlCreateUserProcess@40 RtlCreateUserThread=RtlCreateUserThread@40 RtlCompactHeap=RtlCompactHeap@8 RtlCompareString=RtlCompareString@12 @@ -449,8 +450,10 @@ RtlConvertLongToLargeInteger=RtlConvertLongToLargeInteger@4 RtlConvertUlongToLargeInteger=RtlConvertUlongToLargeInteger@4 RtlCopyString=RtlCopyString@8 RtlCopyUnicodeString=RtlCopyUnicodeString@8 +RtlDeNormalizeProcessParams=RtlDeNormalizeProcessParams@4 RtlDestroyEnvironment=RtlDestroyEnvironment@4 RtlDestroyHeap=RtlDestroyHeap@4 +RtlDestroyProcessParameters=RtlDestroyProcessParameters@4 RtlDowncaseUnicodeString=RtlDowncaseUnicodeString@12 RtlEnlargedIntegerMultiply=RtlEnlargedIntegerMultiply@8 RtlEnlargedUnsignedDivide=RtlEnlargedUnsignedDivide@16 @@ -483,6 +486,7 @@ RtlLengthSecurityDescriptor RtlLockHeap=RtlLockHeap@4 RtlMoveMemory=RtlMoveMemory@12 RtlMultiByteToUnicodeN=RtlMultiByteToUnicodeN@20 +RtlNormalizeProcessParams=RtlNormalizeProcessParams@4 RtlNtStatusToDosError RtlNtStatusToPsxErrno=RtlNtStatusToPsxErrno@4 RtlOemStringToUnicodeSize=RtlOemStringToUnicodeSize@4 @@ -491,6 +495,7 @@ RtlOemToUnicodeN=RtlOemToUnicodeN@20 RtlQueryEnvironmentVariable_U=RtlQueryEnvironmentVariable_U@12 RtlReAllocateHeap=RtlReAllocateHeap@16 RtlReleasePebLock=RtlReleasePebLock@0 +RtlSetCurrentEnvironment=RtlSetCurrentEnvironment@8 RtlSetEnvironmentVariable=RtlSetEnvironmentVariable@12 RtlSizeHeap=RtlSizeHeap@12 RtlUnlockHeap=RtlUnlockHeap@4 diff --git a/reactos/lib/ntdll/rtl/env.c b/reactos/lib/ntdll/rtl/env.c index 3f9d66a801d..67695bd811c 100644 --- a/reactos/lib/ntdll/rtl/env.c +++ b/reactos/lib/ntdll/rtl/env.c @@ -1,4 +1,4 @@ -/* $Id: env.c,v 1.2 1999/12/01 17:34:55 ekohl Exp $ +/* $Id: env.c,v 1.3 1999/12/06 00:22:43 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -16,12 +16,15 @@ #include #include +//#define NDEBUG +#include + /* FUNCTIONS *****************************************************************/ NTSTATUS STDCALL RtlCreateEnvironment ( - BOOLEAN Inherit, + BOOLEAN Initialize, PVOID *Environment ) { @@ -29,11 +32,11 @@ RtlCreateEnvironment ( PVOID EnvPtr = NULL; NTSTATUS Status = STATUS_SUCCESS; ULONG RegionSize = 1; -#if 0 - if (Inherit == TRUE) + + if (Initialize == FALSE) { RtlAcquirePebLock (); - +#if 0 if (NtCurrentPeb()->ProcessParameters->Environment != NULL) { Status = NtQueryVirtualMemory (NtCurrentProcess (), @@ -69,6 +72,7 @@ RtlCreateEnvironment ( *Environment = EnvPtr; } +#endif RtlReleasePebLock (); } else @@ -83,7 +87,7 @@ RtlCreateEnvironment ( if (NT_SUCCESS(Status)) *Environment = EnvPtr; } -#endif + return Status; } @@ -112,14 +116,17 @@ RtlSetCurrentEnvironment ( { PVOID EnvPtr; + DPRINT ("NewEnvironment %x OldEnvironment %x\n", + NewEnvironment, OldEnvironment); + RtlAcquirePebLock (); -#if 0 - EnvPtr = NtCurrentPeb()->ProcessParameters->Environment; - NtCurrentPeb()->ProcessParameters->Environment = NewEnvironment; + + EnvPtr = NtCurrentPeb()->Ppb->Environment; + NtCurrentPeb()->Ppb->Environment = NewEnvironment; if (OldEnvironment != NULL) *OldEnvironment = EnvPtr; -#endif + RtlReleasePebLock (); } diff --git a/reactos/lib/ntdll/rtl/process.c b/reactos/lib/ntdll/rtl/process.c index d810743d175..fc313d5bc26 100644 --- a/reactos/lib/ntdll/rtl/process.c +++ b/reactos/lib/ntdll/rtl/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.4 1999/12/01 15:14:59 ekohl Exp $ +/* $Id: process.c,v 1.5 1999/12/06 00:22:43 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -53,7 +53,7 @@ RtlpCreateFirstThread(HANDLE ProcessHandle, PVOID BaseAddress; ULONG BytesWritten; HANDLE DupNTDllSectionHandle, DupSectionHandle; - + ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); ObjectAttributes.RootDirectory = NULL; ObjectAttributes.ObjectName = NULL; @@ -61,14 +61,12 @@ RtlpCreateFirstThread(HANDLE ProcessHandle, // ObjectAttributes.Attributes = OBJ_INHERIT; ObjectAttributes.SecurityDescriptor = SecurityDescriptor; ObjectAttributes.SecurityQualityOfService = NULL; - + if ((dwCreationFlags & CREATE_SUSPENDED) == CREATE_SUSPENDED) CreateSuspended = TRUE; else CreateSuspended = FALSE; - - - + BaseAddress = (PVOID)(STACK_TOP - dwStackSize); Status = NtAllocateVirtualMemory(ProcessHandle, &BaseAddress, @@ -80,7 +78,7 @@ RtlpCreateFirstThread(HANDLE ProcessHandle, { return(NULL); } - + memset(&ThreadContext,0,sizeof(CONTEXT)); ThreadContext.Eip = (ULONG)lpStartAddress; @@ -89,12 +87,12 @@ RtlpCreateFirstThread(HANDLE ProcessHandle, ThreadContext.SegEs = USER_DS; ThreadContext.SegDs = USER_DS; ThreadContext.SegCs = USER_CS; - ThreadContext.SegSs = USER_DS; + ThreadContext.SegSs = USER_DS; ThreadContext.Esp = STACK_TOP - 16; ThreadContext.EFlags = (1<<1) + (1<<9); - + DPRINT("ThreadContext.Eip %x\n",ThreadContext.Eip); - + NtDuplicateObject(NtCurrentProcess(), &SectionHandle, ProcessHandle, @@ -136,7 +134,7 @@ RtlpCreateFirstThread(HANDLE ProcessHandle, CreateSuspended); if ( lpThreadId != NULL ) memcpy(lpThreadId, &ClientId.UniqueThread,sizeof(ULONG)); - + return ThreadHandle; } @@ -176,7 +174,6 @@ RtlpMapFile(PUNICODE_STRING ApplicationName, &IoStatusBlock, FILE_SHARE_DELETE|FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE); - if (!NT_SUCCESS(Status)) return Status; @@ -205,7 +202,7 @@ RtlpMapFile(PUNICODE_STRING ApplicationName, &FileOffset, NULL); if (!NT_SUCCESS(Status)) - return Status; + return Status; Status = NtCreateSection(Section, SECTION_ALL_ACCESS, @@ -216,7 +213,7 @@ RtlpMapFile(PUNICODE_STRING ApplicationName, hFile); NtClose(hFile); - if (!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) return Status; return STATUS_SUCCESS; @@ -224,28 +221,31 @@ RtlpMapFile(PUNICODE_STRING ApplicationName, static NTSTATUS -RtlpCreatePeb(HANDLE ProcessHandle, PUNICODE_STRING CommandLine) +RtlpCreatePeb ( + HANDLE ProcessHandle, + PPPB Ppb) { NTSTATUS Status; + ULONG BytesWritten; PVOID PebBase; ULONG PebSize; - NT_PEB Peb; - ULONG BytesWritten; - PVOID ProcessInfoBase; - ULONG ProcessInfoSize; - PROCESSINFO ProcessInfo; + PEB Peb; + PVOID PpbBase; + ULONG PpbSize; PebBase = (PVOID)PEB_BASE; PebSize = 0x1000; - NtReadVirtualMemory(ProcessHandle, - (PVOID)PEB_BASE, - &Peb, - sizeof(Peb), - &BytesWritten); + Status = NtAllocateVirtualMemory ( + ProcessHandle, + &PebBase, + 0, + &PebSize, + MEM_COMMIT, + PAGE_READWRITE); - memset(&Peb, 0, sizeof(Peb)); - Peb.ProcessInfo = (PPROCESSINFO)PEB_STARTUPINFO; + memset(&Peb, 0, sizeof(Peb)); + Peb.Ppb = (PPPB)PEB_STARTUPINFO; NtWriteVirtualMemory(ProcessHandle, (PVOID)PEB_BASE, @@ -253,40 +253,42 @@ RtlpCreatePeb(HANDLE ProcessHandle, PUNICODE_STRING CommandLine) sizeof(Peb), &BytesWritten); - ProcessInfoBase = (PVOID)PEB_STARTUPINFO; - ProcessInfoSize = 0x1000; + PpbBase = (PVOID)PEB_STARTUPINFO; + PpbSize = Ppb->TotalSize; Status = NtAllocateVirtualMemory(ProcessHandle, - &ProcessInfoBase, + &PpbBase, 0, - &ProcessInfoSize, + &PpbSize, MEM_COMMIT, PAGE_READWRITE); if (!NT_SUCCESS(Status)) return(Status); - memset(&ProcessInfo, 0, sizeof(PROCESSINFO)); - wcscpy(ProcessInfo.CommandLine, CommandLine->Buffer); + DPRINT("Ppb size %x\n", PpbSize); + NtWriteVirtualMemory ( + ProcessHandle, + (PVOID)PEB_STARTUPINFO, + Ppb, + Ppb->TotalSize, + &BytesWritten); - DPRINT("ProcessInfoSize %x\n",ProcessInfoSize); - NtWriteVirtualMemory(ProcessHandle, - (PVOID)PEB_STARTUPINFO, - &ProcessInfo, - ProcessInfoSize, - &BytesWritten); - - return STATUS_SUCCESS; + return STATUS_SUCCESS; } -NTSTATUS STDCALL -RtlCreateUserProcess(PUNICODE_STRING ApplicationName, - PSECURITY_DESCRIPTOR ProcessSd, - PSECURITY_DESCRIPTOR ThreadSd, - WINBOOL bInheritHandles, - DWORD dwCreationFlags, - PCLIENT_ID ClientId, - PHANDLE ProcessHandle, - PHANDLE ThreadHandle) +NTSTATUS +STDCALL +RtlCreateUserProcess ( + PUNICODE_STRING CommandLine, + ULONG Unknown1, + PPPB Ppb, + PSECURITY_DESCRIPTOR ProcessSd, + PSECURITY_DESCRIPTOR ThreadSd, + WINBOOL bInheritHandles, + DWORD dwCreationFlags, + PCLIENT_ID ClientId, + PHANDLE ProcessHandle, + PHANDLE ThreadHandle) { HANDLE hSection, hProcess, hThread; NTSTATUS Status; @@ -303,16 +305,16 @@ RtlCreateUserProcess(PUNICODE_STRING ApplicationName, CLIENT_ID LocalClientId; ULONG retlen; - DPRINT("RtlCreateUserProcess(ApplicationName '%w')\n", - ApplicationName->Buffer); + DPRINT ("RtlCreateUserProcess(CommandLine '%w')\n", + CommandLine->Buffer); - Status = RtlpMapFile(ApplicationName, + Status = RtlpMapFile(CommandLine, &Headers, &DosHeader, &hSection); Status = NtCreateProcess(&hProcess, - PROCESS_ALL_ACCESS, + PROCESS_ALL_ACCESS, NULL, NtCurrentProcess(), bInheritHandles, @@ -328,16 +330,16 @@ RtlCreateUserProcess(PUNICODE_STRING ApplicationName, DPRINT("ProcessBasicInfo.UniqueProcessId %d\n", ProcessBasicInfo.UniqueProcessId); LocalClientId.UniqueProcess = ProcessBasicInfo.UniqueProcessId; - + /* * Map NT DLL into the process */ Status = LdrMapNTDllForProcess(hProcess, &NTDllSection); - + InitialViewSize = DosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * Headers.FileHeader.NumberOfSections; - + BaseAddress = (PVOID)Headers.OptionalHeader.ImageBase; SectionOffset.QuadPart = 0; Status = NtMapViewOfSection(hSection, @@ -352,29 +354,30 @@ RtlCreateUserProcess(PUNICODE_STRING ApplicationName, PAGE_READWRITE); if (!NT_SUCCESS(Status)) return Status; - + /* * */ DPRINT("Creating peb\n"); - RtlpCreatePeb(hProcess, ApplicationName); - + RtlpCreatePeb (hProcess, Ppb); + DPRINT("Creating thread for process\n"); lpStartAddress = (LPTHREAD_START_ROUTINE) ((PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(NTDLL_BASE))-> AddressOfEntryPoint + ((PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(NTDLL_BASE))->ImageBase; - hThread = RtlpCreateFirstThread(hProcess, - ThreadSd, - Headers.OptionalHeader.SizeOfStackReserve, - lpStartAddress, - lpParameter, - dwCreationFlags, - &LocalClientId.UniqueThread, - TempCommandLine, - NTDllSection, - hSection, - (PVOID)Headers.OptionalHeader.ImageBase); + hThread = RtlpCreateFirstThread ( + hProcess, + ThreadSd, + Headers.OptionalHeader.SizeOfStackReserve, + lpStartAddress, + lpParameter, + dwCreationFlags, + &LocalClientId.UniqueThread, + TempCommandLine, + NTDllSection, + hSection, + (PVOID)Headers.OptionalHeader.ImageBase); if ( hThread == NULL ) return Status; @@ -410,4 +413,346 @@ RtlReleasePebLock (VOID) } +NTSTATUS +STDCALL +RtlCreateProcessParameters ( + PPPB *Ppb, + PUNICODE_STRING CommandLine, + PUNICODE_STRING LibraryPath, + PUNICODE_STRING CurrentDirectory, + PUNICODE_STRING ImageName, + PVOID Environment, + PUNICODE_STRING Title, + PUNICODE_STRING Desktop, + PUNICODE_STRING Reserved, + PVOID Reserved2 + ) +{ + NTSTATUS Status = STATUS_SUCCESS; + PPPB Param = NULL; + ULONG RegionSize = 0; + ULONG DataSize = 0; + PWCHAR Dest; + + DPRINT ("RtlCreateProcessParameters\n"); + + RtlAcquirePebLock (); + + /* size of process parameter block */ + DataSize = sizeof (PPB); + + /* size of (reserved) buffer */ + DataSize += (256 * sizeof(WCHAR)); + + /* size of current directory buffer */ + DataSize += (MAX_PATH * sizeof(WCHAR)); + + /* add string lengths */ + if (LibraryPath != NULL) + DataSize += (LibraryPath->Length + sizeof(WCHAR)); + + if (CommandLine != NULL) + DataSize += (CommandLine->Length + sizeof(WCHAR)); + + if (ImageName != NULL) + DataSize += (ImageName->Length + sizeof(WCHAR)); + + if (Title != NULL) + DataSize += (Title->Length + sizeof(WCHAR)); + + if (Desktop != NULL) + DataSize += (Desktop->Length + sizeof(WCHAR)); + + if (Reserved != NULL) + DataSize += (Reserved->Length + sizeof(WCHAR)); + + /* Calculate the required block size */ + RegionSize = DataSize; + + Status = NtAllocateVirtualMemory ( + NtCurrentProcess (), + (PVOID*)&Param, + 0, + &RegionSize, + MEM_COMMIT, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + RtlReleasePebLock (); + return Status; + } + + DPRINT ("Ppb allocated\n"); + + Param->TotalSize = RegionSize; + Param->DataSize = DataSize; + Param->Normalized = TRUE; + Param->Environment = Environment; +// Param->Unknown1 = +// Param->Unknown2 = +// Param->Unknown3 = +// Param->Unknown4 = + + /* copy current directory */ + Dest = (PWCHAR)(((PBYTE)Param) + sizeof(PPB) + (256 * sizeof(WCHAR))); + + Param->CurrentDirectory.Buffer = Dest; + if (CurrentDirectory != NULL) + { + Param->CurrentDirectory.Length = CurrentDirectory->Length; + Param->CurrentDirectory.MaximumLength = CurrentDirectory->Length + sizeof(WCHAR); + memcpy (Dest, + CurrentDirectory->Buffer, + CurrentDirectory->Length); + Dest = (PWCHAR)(((PBYTE)Dest) + CurrentDirectory->Length); + } + *Dest = 0; + + Dest = (PWCHAR)(((PBYTE)Param) + sizeof(PPB) + + (256 * sizeof(WCHAR)) + (MAX_PATH * sizeof(WCHAR))); + + /* copy library path */ + Param->LibraryPath.Buffer = Dest; + if (LibraryPath != NULL) + { + Param->LibraryPath.Length = LibraryPath->Length; + memcpy (Dest, + LibraryPath->Buffer, + LibraryPath->Length); + Dest = (PWCHAR)(((PBYTE)Dest) + LibraryPath->Length); + } + Param->LibraryPath.MaximumLength = Param->LibraryPath.Length + sizeof(WCHAR); + *Dest = 0; + Dest++; + + /* copy command line */ + Param->CommandLine.Buffer = Dest; + if (CommandLine != NULL) + { + Param->CommandLine.Length = CommandLine->Length; + memcpy (Dest, + CommandLine->Buffer, + CommandLine->Length); + Dest = (PWCHAR)(((PBYTE)Dest) + CommandLine->Length); + } + Param->CommandLine.MaximumLength = Param->CommandLine.Length + sizeof(WCHAR); + *Dest = 0; + Dest++; + + /* copy image name */ + Param->ImageName.Buffer = Dest; + if (ImageName != NULL) + { + Param->ImageName.Length = ImageName->Length; + memcpy (Dest, + ImageName->Buffer, + ImageName->Length); + Dest = (PWCHAR)(((PBYTE)Dest) + ImageName->Length); + } + Param->ImageName.MaximumLength = Param->ImageName.Length + sizeof(WCHAR); + *Dest = 0; + Dest++; + + /* copy title */ + Param->Title.Buffer = Dest; + if (Title != NULL) + { + Param->Title.Length = Title->Length; + memcpy (Dest, + Title->Buffer, + Title->Length); + Dest = (PWCHAR)(((PBYTE)Dest) + Title->Length); + } + Param->Title.MaximumLength = Param->Title.Length + sizeof(WCHAR); + *Dest = 0; + Dest++; + + /* copy desktop */ + Param->Desktop.Buffer = Dest; + if (Desktop != NULL) + { + Param->Desktop.Length = Desktop->Length; + memcpy (Dest, + Desktop->Buffer, + Desktop->Length); + Dest = (PWCHAR)(((PBYTE)Dest) + Desktop->Length); + } + Param->Desktop.MaximumLength = Param->Desktop.Length + sizeof(WCHAR); + *Dest = 0; + Dest++; + + /* copy reserved */ + Param->Reserved.Buffer = Dest; + if (Reserved != NULL) + { + Param->Reserved.Length = Reserved->Length; + memcpy (Dest, + Reserved->Buffer, + Reserved->Length); + Dest = (PWCHAR)(((PBYTE)Dest) + Reserved->Length); + } + Param->Reserved.MaximumLength = Param->Reserved.Length + sizeof(WCHAR); + *Dest = 0; + Dest++; + + /* set reserved2 */ + Param->Reserved2.Length = 0; + Param->Reserved2.MaximumLength = 0; + Param->Reserved2.Buffer = NULL; + + RtlDeNormalizeProcessParams (Param); + *Ppb = Param; + RtlReleasePebLock (); + + return Status; +} + +VOID +STDCALL +RtlDestroyProcessParameters ( + PPPB Ppb + ) +{ + ULONG RegionSize = 0; + + NtFreeVirtualMemory (NtCurrentProcess (), + (PVOID)Ppb, + &RegionSize, + MEM_RELEASE); +} + +/* + * denormalize process parameters (Pointer-->Offset) + */ +VOID +STDCALL +RtlDeNormalizeProcessParams ( + PPPB Ppb + ) +{ + if (Ppb == NULL) + return; + + if (Ppb->Normalized == FALSE) + return; + + if (Ppb->CurrentDirectory.Buffer != NULL) + { + Ppb->CurrentDirectory.Buffer = + (PWSTR)((ULONG)Ppb->CurrentDirectory.Buffer - + (ULONG)Ppb); + } + + if (Ppb->LibraryPath.Buffer != NULL) + { + Ppb->LibraryPath.Buffer = + (PWSTR)((ULONG)Ppb->LibraryPath.Buffer - + (ULONG)Ppb); + } + + if (Ppb->CommandLine.Buffer != NULL) + { + Ppb->CommandLine.Buffer = + (PWSTR)((ULONG)Ppb->CommandLine.Buffer - + (ULONG)Ppb); + } + + if (Ppb->ImageName.Buffer != NULL) + { + Ppb->ImageName.Buffer = + (PWSTR)((ULONG)Ppb->ImageName.Buffer - + (ULONG)Ppb); + } + + if (Ppb->Title.Buffer != NULL) + { + Ppb->Title.Buffer = + (PWSTR)((ULONG)Ppb->Title.Buffer - + (ULONG)Ppb); + } + + if (Ppb->Desktop.Buffer != NULL) + { + Ppb->Desktop.Buffer = + (PWSTR)((ULONG)Ppb->Desktop.Buffer - + (ULONG)Ppb); + } + + if (Ppb->Reserved.Buffer != NULL) + { + Ppb->Reserved.Buffer = + (PWSTR)((ULONG)Ppb->Reserved.Buffer - + (ULONG)Ppb); + } + + Ppb->Normalized = FALSE; +} + +/* + * normalize process parameters (Offset-->Pointer) + */ +VOID +STDCALL +RtlNormalizeProcessParams ( + PPPB Ppb + ) +{ + if (Ppb == NULL) + return; + + if (Ppb->Normalized == TRUE) + return; + + if (Ppb->CurrentDirectory.Buffer != NULL) + { + Ppb->CurrentDirectory.Buffer = + (PWSTR)((ULONG)Ppb->CurrentDirectory.Buffer + + (ULONG)Ppb); + } + + if (Ppb->LibraryPath.Buffer != NULL) + { + Ppb->LibraryPath.Buffer = + (PWSTR)((ULONG)Ppb->LibraryPath.Buffer + + (ULONG)Ppb); + } + + if (Ppb->CommandLine.Buffer != NULL) + { + Ppb->CommandLine.Buffer = + (PWSTR)((ULONG)Ppb->CommandLine.Buffer + + (ULONG)Ppb); + } + + if (Ppb->ImageName.Buffer != NULL) + { + Ppb->ImageName.Buffer = + (PWSTR)((ULONG)Ppb->ImageName.Buffer + + (ULONG)Ppb); + } + + if (Ppb->Title.Buffer != NULL) + { + Ppb->Title.Buffer = + (PWSTR)((ULONG)Ppb->Title.Buffer + + (ULONG)Ppb); + } + + if (Ppb->Desktop.Buffer != NULL) + { + Ppb->Desktop.Buffer = + (PWSTR)((ULONG)Ppb->Desktop.Buffer + + (ULONG)Ppb); + } + + if (Ppb->Reserved.Buffer != NULL) + { + Ppb->Reserved.Buffer = + (PWSTR)((ULONG)Ppb->Reserved.Buffer + + (ULONG)Ppb); + } + + Ppb->Normalized = TRUE; +} + /* EOF */ diff --git a/reactos/lib/ntdll/rtl/thread.c b/reactos/lib/ntdll/rtl/thread.c index 10c0159944c..23a6a02d3d4 100644 --- a/reactos/lib/ntdll/rtl/thread.c +++ b/reactos/lib/ntdll/rtl/thread.c @@ -103,7 +103,7 @@ RtlCreateUserThread(HANDLE ProcessHandle, &RegionSize, MEM_RELEASE); - DPRINT("Error committing stack page!\n"); + DPRINT("Error comitting stack page!\n"); return Status; } @@ -126,7 +126,7 @@ RtlCreateUserThread(HANDLE ProcessHandle, &RegionSize, MEM_RELEASE); - DPRINT("Error committing guard page!\n"); + DPRINT("Error comitting guard page!\n"); return Status; } @@ -212,7 +212,7 @@ RtlInitializeContext(HANDLE ProcessHandle, Context->SegEs = USER_DS; Context->SegDs = USER_DS; Context->SegCs = USER_CS; - Context->SegSs = USER_DS; + Context->SegSs = USER_DS; Context->Esp = (ULONG)InitialTeb->StackBase - 8; Context->EFlags = (1<<1) + (1<<9); diff --git a/reactos/ntoskrnl/ldr/init.c b/reactos/ntoskrnl/ldr/init.c index 7d5b18c9785..cf5352d4def 100644 --- a/reactos/ntoskrnl/ldr/init.c +++ b/reactos/ntoskrnl/ldr/init.c @@ -57,27 +57,80 @@ static NTSTATUS LdrCreatePeb(HANDLE ProcessHandle) { - PVOID PebBase; - ULONG PebSize; - NT_PEB Peb; - ULONG BytesWritten; + PVOID PebBase; + ULONG PebSize; + PEB Peb; + PVOID PpbBase; + ULONG PpbSize; + PPB Ppb; + ULONG BytesWritten; + NTSTATUS Status; - PebBase = (PVOID)PEB_BASE; - PebSize = 0x1000; + PebBase = (PVOID)PEB_BASE; + PebSize = 0x1000; - memset(&Peb, 0, sizeof Peb); + memset(&Peb, 0, sizeof Peb); - Peb.ProcessInfo = (PPROCESSINFO) PEB_STARTUPINFO; + Peb.Ppb = (PPPB)PEB_STARTUPINFO; - ZwWriteVirtualMemory(ProcessHandle, - (PVOID)PEB_BASE, - &Peb, - sizeof(Peb), + Status = ZwAllocateVirtualMemory ( + ProcessHandle, + (PVOID*)&PebBase, + 0, + &PebSize, + MEM_COMMIT, + PAGE_READWRITE + ); + if (!NT_SUCCESS(Status)) + { + DbgPrint ("Peb allocation failed \n"); + DbgPrintErrorMessage (Status); + } + + ZwWriteVirtualMemory ( + ProcessHandle, + PebBase, + &Peb, + sizeof(Peb), + &BytesWritten); + + /* write pointer to peb on the stack (parameter of NtProcessStartup) */ + ZwWriteVirtualMemory( + ProcessHandle, + (PVOID) (STACK_TOP - 16), + &PebBase, + sizeof (PVOID), + & BytesWritten + ); + + /* Create process parameters block (PPB)*/ + PpbBase = (PVOID)PEB_STARTUPINFO; + PpbSize = sizeof (PPB); + + Status = ZwAllocateVirtualMemory ( + ProcessHandle, + (PVOID*)&PpbBase, + 0, + &PpbSize, + MEM_COMMIT, + PAGE_READWRITE + ); + if (!NT_SUCCESS(Status)) + { + DbgPrint ("Ppb allocation failed \n"); + DbgPrintErrorMessage (Status); + } + + memset(&Ppb, 0, sizeof(PPB)); + + ZwWriteVirtualMemory ( + ProcessHandle, + PpbBase, + &Ppb, + sizeof(PPB), &BytesWritten); - /* FIXME: Create ProcessInfo block */ - - return(STATUS_SUCCESS); + return(STATUS_SUCCESS); } @@ -117,23 +170,23 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, */ LdrGetSystemDirectory(TmpNameBuffer, sizeof TmpNameBuffer); wcscat(TmpNameBuffer, L"\\ntdll.dll"); - RtlInitUnicodeString(&DllPathname, TmpNameBuffer); + RtlInitUnicodeString(&DllPathname, TmpNameBuffer); InitializeObjectAttributes(&FileObjectAttributes, - &DllPathname, + &DllPathname, 0, NULL, NULL); DPRINT("Opening NTDLL\n"); - Status = ZwOpenFile(&FileHandle, - FILE_ALL_ACCESS, - &FileObjectAttributes, - NULL, - 0, + Status = ZwOpenFile(&FileHandle, + FILE_ALL_ACCESS, + &FileObjectAttributes, + NULL, + 0, 0); if (!NT_SUCCESS(Status)) { DbgPrint("NTDLL open failed "); - DbgPrintErrorMessage(Status); + DbgPrintErrorMessage(Status); return Status; } Status = ZwReadFile(FileHandle, @@ -149,10 +202,10 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, { DPRINT("NTDLL header read failed "); DbgPrintErrorMessage(Status); - ZwClose(FileHandle); + ZwClose(FileHandle); return Status; } - + /* * FIXME: this will fail if the NT headers are * more than 1024 bytes from start. @@ -192,7 +245,7 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, return Status; } - + /* * Map the NTDLL into the process */ @@ -222,7 +275,7 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, return Status; } - + for (i = 0; (i < NTHeaders->FileHeader.NumberOfSections); i++) @@ -399,9 +452,9 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, Status = ZwAllocateVirtualMemory( ProcessHandle, - (PVOID *) & StackBase, + (PVOID *) & StackBase, 0, - & StackSize, + & StackSize, MEM_COMMIT, PAGE_READWRITE ); @@ -415,7 +468,7 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, return Status; } - + ZwDuplicateObject( NtCurrentProcess(), & SectionHandle, @@ -434,7 +487,7 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, FALSE, DUPLICATE_SAME_ACCESS ); - + ZwWriteVirtualMemory( ProcessHandle, (PVOID) (STACK_TOP - 4), @@ -458,14 +511,14 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, ); /* * Create a peb (grungy) - */ + */ Status = LdrCreatePeb(ProcessHandle); if (!NT_SUCCESS(Status)) { DbgPrint("LDR: Failed to create initial peb\n"); return (Status); } - + /* * Initialize context to point to LdrStartup */ @@ -479,7 +532,7 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, Context.SegEs = USER_DS; Context.SegFs = USER_DS; Context.SegGs = USER_DS; - + DPRINT("LdrStartupAddr %x\n",LdrStartupAddr); /* * FIXME: Create process and let 'er rip @@ -519,8 +572,8 @@ NTSTATUS LdrLoadInitialProcess (VOID) HANDLE ProcessHandle; UNICODE_STRING ProcessName; WCHAR TmpNameBuffer [MAX_PATH]; - - + + Status = ZwCreateProcess(&ProcessHandle, PROCESS_ALL_ACCESS, NULL, @@ -540,7 +593,6 @@ NTSTATUS LdrLoadInitialProcess (VOID) * alias name which is in \\??\\). */ LdrGetSystemDirectory(TmpNameBuffer, sizeof TmpNameBuffer); -// wcscat(TmpNameBuffer, L"\\shell.exe"); wcscat(TmpNameBuffer, L"\\smss.exe"); RtlInitUnicodeString(&ProcessName, TmpNameBuffer); Status = LdrLoadImage(ProcessHandle, &ProcessName); diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 525505ef577..f89ddb0f186 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -141,7 +141,7 @@ static NTSTATUS PsCreatePeb(HANDLE ProcessHandle) NTSTATUS Status; PVOID PebBase; ULONG PebSize; - NT_PEB Peb; + PEB Peb; ULONG BytesWritten; PebBase = (PVOID)PEB_BASE; diff --git a/reactos/subsys/smss/init.c b/reactos/subsys/smss/init.c index 4c35566796b..32639667794 100644 --- a/reactos/subsys/smss/init.c +++ b/reactos/subsys/smss/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.5 1999/12/04 21:11:00 ea Exp $ +/* $Id: init.c,v 1.6 1999/12/06 00:25:14 ekohl Exp $ * * init.c - Session Manager initialization * @@ -74,6 +74,8 @@ InitSessionManager ( UNICODE_STRING UnicodeString; OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING CmdLineW; + PPPB Ppb; + /* Create the "\SmApiPort" object (LPC) */ RtlInitUnicodeString (&UnicodeString, @@ -131,6 +133,12 @@ InitSessionManager ( DisplayString (L"SM: System Environment created\n"); #endif + RtlSetCurrentEnvironment (SmSystemEnvironment, + NULL); +#ifndef NDEBUG + DisplayString (L"System Environment set\n"); +#endif + /* FIXME: Define symbolic links to kernel devices (MS-DOS names) */ /* FIXME: Run all programs in the boot execution list */ @@ -184,13 +192,27 @@ InitSessionManager ( DisplayString (L"SM: Executing shell\n"); RtlInitUnicodeString (&UnicodeString, L"\\??\\C:\\reactos\\system32\\shell.exe"); - #if 0 /* Start the logon process (winlogon.exe) */ RtlInitUnicodeString (&CmdLineW, L"\\??\\C:\\reactos\\system32\\winlogon.exe"); #endif + + RtlCreateProcessParameters (&Ppb, + &UnicodeString, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL); + + Status = RtlCreateUserProcess (&UnicodeString, + 0, + Ppb, NULL, NULL, FALSE, @@ -199,6 +221,8 @@ InitSessionManager ( &Children[CHILD_WINLOGON], NULL); + RtlDestroyProcessParameters (Ppb); + if (!NT_SUCCESS(Status)) { DisplayString (L"SM: Loading shell.exe failed!\n"); diff --git a/reactos/subsys/smss/smss.c b/reactos/subsys/smss/smss.c index d8f7f0c2b94..a452ecc9f1a 100644 --- a/reactos/subsys/smss/smss.c +++ b/reactos/subsys/smss/smss.c @@ -1,4 +1,4 @@ -/* $Id: smss.c,v 1.2 1999/12/01 15:18:54 ekohl Exp $ +/* $Id: smss.c,v 1.3 1999/12/06 00:25:14 ekohl Exp $ * * smss.c - Session Manager * @@ -41,15 +41,39 @@ DisplayString( LPCWSTR lpwString ) } +void +PrintString (char* fmt,...) +{ + char buffer[512]; + va_list ap; + UNICODE_STRING UnicodeString; + ANSI_STRING AnsiString; + ULONG i; + + va_start(ap, fmt); + vsprintf(buffer, fmt, ap); + va_end(ap); + + RtlInitAnsiString (&AnsiString, buffer); + RtlAnsiStringToUnicodeString ( + &UnicodeString, + &AnsiString, + TRUE); + NtDisplayString(&UnicodeString); + RtlFreeUnicodeString (&UnicodeString); +} + + /* Native image's entry point */ void -NtProcessStartup( PSTARTUP_ARGUMENT StartupArgument ) +NtProcessStartup (PPEB Peb) { HANDLE Children[2]; /* csrss, winlogon */ DisplayString( L"Session Manager\n" ); + PrintString ("Peb %x\n", Peb); if (TRUE == InitSessionManager(Children)) {