Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
84d25135
Commit
84d25135
authored
Jun 10, 2020
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Implement NtCreateUserProcess().
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
df513b95
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
281 additions
and
42 deletions
+281
-42
ntdll.spec
dlls/ntdll/ntdll.spec
+1
-0
process.c
dlls/ntdll/process.c
+154
-38
winternl.h
include/winternl.h
+126
-4
No files found.
dlls/ntdll/ntdll.spec
View file @
84d25135
...
...
@@ -186,6 +186,7 @@
@ stdcall NtCreateThreadEx(ptr long ptr long ptr ptr long long long long ptr)
@ stdcall NtCreateTimer(ptr long ptr long)
@ stub NtCreateToken
@ stdcall NtCreateUserProcess(ptr ptr long long ptr ptr long long ptr ptr ptr)
# @ stub NtCreateWaitablePort
@ stdcall -arch=win32,arm64 NtCurrentTeb()
# @ stub NtDebugActiveProcess
...
...
dlls/ntdll/process.c
View file @
84d25135
...
...
@@ -1595,36 +1595,62 @@ NTSTATUS restart_process( RTL_USER_PROCESS_PARAMETERS *params, NTSTATUS status )
/**********************************************************************
*
Rtl
CreateUserProcess (NTDLL.@)
*
Nt
CreateUserProcess (NTDLL.@)
*/
NTSTATUS
WINAPI
RtlCreateUserProcess
(
UNICODE_STRING
*
path
,
ULONG
attributes
,
RTL_USER_PROCESS_PARAMETERS
*
param
s
,
SECURITY_DESCRIPTOR
*
process_desc
r
,
SECURITY_DESCRIPTOR
*
thread_descr
,
HANDLE
parent
,
BOOLEAN
inherit
,
HANDLE
debug
,
HANDLE
exception
,
RTL_USER_PROCESS_INFORMATION
*
info
)
NTSTATUS
WINAPI
NtCreateUserProcess
(
HANDLE
*
process_handle_ptr
,
HANDLE
*
thread_handle_ptr
,
ACCESS_MASK
process_access
,
ACCESS_MASK
thread_acces
s
,
OBJECT_ATTRIBUTES
*
process_attr
,
OBJECT_ATTRIBUTES
*
thread_att
r
,
ULONG
process_flags
,
ULONG
thread_flags
,
RTL_USER_PROCESS_PARAMETERS
*
params
,
PS_CREATE_INFO
*
info
,
PS_ATTRIBUTE_LIST
*
attr
)
{
NTSTATUS
status
;
BOOL
success
=
FALSE
;
HANDLE
file_handle
,
process_info
=
0
,
process_handle
=
0
,
thread_handle
=
0
;
ULONG
process_id
,
thread_id
;
struct
object_attributes
*
objattr
;
data_size_t
attr_len
;
char
*
unixdir
=
NULL
,
*
winedebug
=
NULL
;
startup_info_t
*
startup_info
=
NULL
;
ULONG
startup_info_size
,
env_size
;
int
socketfd
[
2
]
=
{
-
1
,
-
1
};
OBJECT_ATTRIBUTES
attr
;
pe_image_info_t
pe_info
;
CLIENT_ID
id
;
HANDLE
parent
=
0
,
debug
=
0
,
token
=
0
;
UNICODE_STRING
path
=
{
0
};
SIZE_T
i
,
attr_count
=
(
attr
->
TotalLength
-
sizeof
(
attr
->
TotalLength
))
/
sizeof
(
PS_ATTRIBUTE
);
RtlNormalizeProcessParams
(
params
);
for
(
i
=
0
;
i
<
attr_count
;
i
++
)
{
switch
(
attr
->
Attributes
[
i
].
Attribute
)
{
case
PS_ATTRIBUTE_PARENT_PROCESS
:
parent
=
attr
->
Attributes
[
i
].
ValuePtr
;
break
;
case
PS_ATTRIBUTE_DEBUG_PORT
:
debug
=
attr
->
Attributes
[
i
].
ValuePtr
;
break
;
case
PS_ATTRIBUTE_IMAGE_NAME
:
path
.
Length
=
attr
->
Attributes
[
i
].
Size
;
path
.
Buffer
=
attr
->
Attributes
[
i
].
ValuePtr
;
break
;
case
PS_ATTRIBUTE_TOKEN
:
token
=
attr
->
Attributes
[
i
].
ValuePtr
;
break
;
default:
if
(
attr
->
Attributes
[
i
].
Attribute
&
PS_ATTRIBUTE_INPUT
)
FIXME
(
"unhandled input attribute %lx
\n
"
,
attr
->
Attributes
[
i
].
Attribute
);
break
;
}
}
TRACE
(
"%s image %s cmdline %s
\n
"
,
debugstr_us
(
path
),
debugstr_us
(
&
params
->
ImagePathName
),
debugstr_us
(
&
params
->
CommandLine
));
TRACE
(
"%s image %s cmdline %s parent %p
\n
"
,
debugstr_us
(
&
path
),
debugstr_us
(
&
params
->
ImagePathName
),
debugstr_us
(
&
params
->
CommandLine
),
parent
);
if
(
debug
)
FIXME
(
"debug port %p not supported yet
\n
"
,
debug
);
if
(
token
)
FIXME
(
"token %p not supported yet
\n
"
,
token
);
if
((
status
=
get_pe_file_info
(
path
,
attributes
,
&
file_handle
,
&
pe_info
)))
if
((
status
=
get_pe_file_info
(
&
path
,
OBJ_CASE_INSENSITIVE
,
&
file_handle
,
&
pe_info
)))
{
if
(
status
==
STATUS_INVALID_IMAGE_NOT_MZ
&&
!
fork_and_exec
(
path
,
params
))
if
(
status
==
STATUS_INVALID_IMAGE_NOT_MZ
&&
!
fork_and_exec
(
&
path
,
params
))
{
memset
(
info
,
0
,
sizeof
(
*
info
)
);
return
STATUS_SUCCESS
;
...
...
@@ -1635,8 +1661,7 @@ NTSTATUS WINAPI RtlCreateUserProcess( UNICODE_STRING *path, ULONG attributes,
env_size
=
get_env_size
(
params
,
&
winedebug
);
unixdir
=
get_unix_curdir
(
params
);
InitializeObjectAttributes
(
&
attr
,
NULL
,
0
,
NULL
,
process_descr
);
if
((
status
=
alloc_object_attributes
(
&
attr
,
&
objattr
,
&
attr_len
)))
goto
done
;
if
((
status
=
alloc_object_attributes
(
process_attr
,
&
objattr
,
&
attr_len
)))
goto
done
;
/* create the socket for the new process */
...
...
@@ -1661,12 +1686,12 @@ NTSTATUS WINAPI RtlCreateUserProcess( UNICODE_STRING *path, ULONG attributes,
SERVER_START_REQ
(
new_process
)
{
req
->
parent_process
=
wine_server_obj_handle
(
parent
);
req
->
inherit_all
=
inherit
;
req
->
parent_process
=
wine_server_obj_handle
(
parent
);
req
->
inherit_all
=
!!
(
process_flags
&
PROCESS_CREATE_FLAGS_INHERIT_HANDLES
)
;
req
->
create_flags
=
params
->
DebugFlags
;
/* hack: creation flags stored in DebugFlags for now */
req
->
socket_fd
=
socketfd
[
1
];
req
->
exe_file
=
wine_server_obj_handle
(
file_handle
);
req
->
access
=
PROCESS_ALL_ACCESS
;
req
->
access
=
process_access
;
req
->
cpu
=
pe_info
.
cpu
;
req
->
info_size
=
startup_info_size
;
wine_server_add_data
(
req
,
objattr
,
attr_len
);
...
...
@@ -1674,8 +1699,8 @@ NTSTATUS WINAPI RtlCreateUserProcess( UNICODE_STRING *path, ULONG attributes,
wine_server_add_data
(
req
,
params
->
Environment
,
env_size
);
if
(
!
(
status
=
wine_server_call
(
req
)))
{
process_id
=
reply
->
pid
;
process_handle
=
wine_server_ptr_handle
(
reply
->
handle
);
id
.
UniqueProcess
=
ULongToHandle
(
reply
->
pid
);
}
process_info
=
wine_server_ptr_handle
(
reply
->
info
);
}
...
...
@@ -1687,30 +1712,29 @@ NTSTATUS WINAPI RtlCreateUserProcess( UNICODE_STRING *path, ULONG attributes,
switch
(
status
)
{
case
STATUS_INVALID_IMAGE_WIN_64
:
ERR
(
"64-bit application %s not supported in 32-bit prefix
\n
"
,
debugstr_us
(
path
)
);
ERR
(
"64-bit application %s not supported in 32-bit prefix
\n
"
,
debugstr_us
(
&
path
)
);
break
;
case
STATUS_INVALID_IMAGE_FORMAT
:
ERR
(
"%s not supported on this installation (%s binary)
\n
"
,
debugstr_us
(
path
),
cpu_names
[
pe_info
.
cpu
]
);
debugstr_us
(
&
path
),
cpu_names
[
pe_info
.
cpu
]
);
break
;
}
goto
done
;
}
InitializeObjectAttributes
(
&
attr
,
NULL
,
0
,
NULL
,
thread_descr
);
if
((
status
=
alloc_object_attributes
(
&
attr
,
&
objattr
,
&
attr_len
)))
goto
done
;
if
((
status
=
alloc_object_attributes
(
thread_attr
,
&
objattr
,
&
attr_len
)))
goto
done
;
SERVER_START_REQ
(
new_thread
)
{
req
->
process
=
wine_server_obj_handle
(
process_handle
);
req
->
access
=
THREAD_ALL_ACCESS
;
req
->
suspend
=
1
;
req
->
access
=
thread_access
;
req
->
suspend
=
!!
(
thread_flags
&
THREAD_CREATE_FLAGS_CREATE_SUSPENDED
)
;
req
->
request_fd
=
-
1
;
wine_server_add_data
(
req
,
objattr
,
attr_len
);
if
(
!
(
status
=
wine_server_call
(
req
)))
{
thread_handle
=
wine_server_ptr_handle
(
reply
->
handle
);
thread_id
=
reply
->
tid
;
id
.
UniqueThread
=
ULongToHandle
(
reply
->
tid
)
;
}
}
SERVER_END_REQ
;
...
...
@@ -1736,19 +1760,49 @@ NTSTATUS WINAPI RtlCreateUserProcess( UNICODE_STRING *path, ULONG attributes,
}
SERVER_END_REQ
;
if
(
success
)
if
(
!
success
)
{
TRACE
(
"%s pid %04x tid %04x handles %p/%p
\n
"
,
debugstr_us
(
path
),
process_id
,
thread_id
,
process_handle
,
thread_handle
);
info
->
Process
=
process_handle
;
info
->
Thread
=
thread_handle
;
info
->
ClientId
.
UniqueProcess
=
ULongToHandle
(
process_id
);
info
->
ClientId
.
UniqueThread
=
ULongToHandle
(
thread_id
);
virtual_fill_image_information
(
&
pe_info
,
&
info
->
ImageInformation
);
process_handle
=
thread_handle
=
0
;
status
=
STATUS_SUCCESS
;
if
(
!
status
)
status
=
STATUS_INTERNAL_ERROR
;
goto
done
;
}
else
if
(
!
status
)
status
=
STATUS_INTERNAL_ERROR
;
TRACE
(
"%s pid %04x tid %04x handles %p/%p
\n
"
,
debugstr_us
(
&
path
),
HandleToULong
(
id
.
UniqueProcess
),
HandleToULong
(
id
.
UniqueThread
),
process_handle
,
thread_handle
);
/* update output attributes */
for
(
i
=
0
;
i
<
attr_count
;
i
++
)
{
switch
(
attr
->
Attributes
[
i
].
Attribute
)
{
case
PS_ATTRIBUTE_CLIENT_ID
:
{
SIZE_T
size
=
min
(
attr
->
Attributes
[
i
].
Size
,
sizeof
(
id
)
);
memcpy
(
attr
->
Attributes
[
i
].
ValuePtr
,
&
id
,
size
);
if
(
attr
->
Attributes
[
i
].
ReturnLength
)
*
attr
->
Attributes
[
i
].
ReturnLength
=
size
;
break
;
}
case
PS_ATTRIBUTE_IMAGE_INFO
:
{
SECTION_IMAGE_INFORMATION
info
;
SIZE_T
size
=
min
(
attr
->
Attributes
[
i
].
Size
,
sizeof
(
info
)
);
virtual_fill_image_information
(
&
pe_info
,
&
info
);
memcpy
(
attr
->
Attributes
[
i
].
ValuePtr
,
&
info
,
size
);
if
(
attr
->
Attributes
[
i
].
ReturnLength
)
*
attr
->
Attributes
[
i
].
ReturnLength
=
size
;
break
;
}
case
PS_ATTRIBUTE_TEB_ADDRESS
:
default:
if
(
!
(
attr
->
Attributes
[
i
].
Attribute
&
PS_ATTRIBUTE_INPUT
))
FIXME
(
"unhandled output attribute %lx
\n
"
,
attr
->
Attributes
[
i
].
Attribute
);
break
;
}
}
*
process_handle_ptr
=
process_handle
;
*
thread_handle_ptr
=
thread_handle
;
process_handle
=
thread_handle
=
0
;
status
=
STATUS_SUCCESS
;
done:
if
(
file_handle
)
NtClose
(
file_handle
);
...
...
@@ -1762,6 +1816,68 @@ done:
return
status
;
}
/**********************************************************************
* RtlCreateUserProcess (NTDLL.@)
*/
NTSTATUS
WINAPI
RtlCreateUserProcess
(
UNICODE_STRING
*
path
,
ULONG
attributes
,
RTL_USER_PROCESS_PARAMETERS
*
params
,
SECURITY_DESCRIPTOR
*
process_descr
,
SECURITY_DESCRIPTOR
*
thread_descr
,
HANDLE
parent
,
BOOLEAN
inherit
,
HANDLE
debug
,
HANDLE
exception
,
RTL_USER_PROCESS_INFORMATION
*
info
)
{
OBJECT_ATTRIBUTES
process_attr
,
thread_attr
;
PS_CREATE_INFO
create_info
;
ULONG_PTR
buffer
[
offsetof
(
PS_ATTRIBUTE_LIST
,
Attributes
[
5
]
)
/
sizeof
(
ULONG_PTR
)];
PS_ATTRIBUTE_LIST
*
attr
=
(
PS_ATTRIBUTE_LIST
*
)
buffer
;
UINT
pos
=
0
;
RtlNormalizeProcessParams
(
params
);
attr
->
Attributes
[
pos
].
Attribute
=
PS_ATTRIBUTE_IMAGE_NAME
;
attr
->
Attributes
[
pos
].
Size
=
path
->
Length
;
attr
->
Attributes
[
pos
].
ValuePtr
=
path
->
Buffer
;
attr
->
Attributes
[
pos
].
ReturnLength
=
NULL
;
pos
++
;
attr
->
Attributes
[
pos
].
Attribute
=
PS_ATTRIBUTE_CLIENT_ID
;
attr
->
Attributes
[
pos
].
Size
=
sizeof
(
info
->
ClientId
);
attr
->
Attributes
[
pos
].
ValuePtr
=
&
info
->
ClientId
;
attr
->
Attributes
[
pos
].
ReturnLength
=
NULL
;
pos
++
;
attr
->
Attributes
[
pos
].
Attribute
=
PS_ATTRIBUTE_IMAGE_INFO
;
attr
->
Attributes
[
pos
].
Size
=
sizeof
(
info
->
ImageInformation
);
attr
->
Attributes
[
pos
].
ValuePtr
=
&
info
->
ImageInformation
;
attr
->
Attributes
[
pos
].
ReturnLength
=
NULL
;
pos
++
;
if
(
parent
)
{
attr
->
Attributes
[
pos
].
Attribute
=
PS_ATTRIBUTE_PARENT_PROCESS
;
attr
->
Attributes
[
pos
].
Size
=
sizeof
(
parent
);
attr
->
Attributes
[
pos
].
ValuePtr
=
parent
;
attr
->
Attributes
[
pos
].
ReturnLength
=
NULL
;
pos
++
;
}
if
(
debug
)
{
attr
->
Attributes
[
pos
].
Attribute
=
PS_ATTRIBUTE_DEBUG_PORT
;
attr
->
Attributes
[
pos
].
Size
=
sizeof
(
debug
);
attr
->
Attributes
[
pos
].
ValuePtr
=
debug
;
attr
->
Attributes
[
pos
].
ReturnLength
=
NULL
;
pos
++
;
}
attr
->
TotalLength
=
offsetof
(
PS_ATTRIBUTE_LIST
,
Attributes
[
pos
]
);
InitializeObjectAttributes
(
&
process_attr
,
NULL
,
0
,
NULL
,
process_descr
);
InitializeObjectAttributes
(
&
thread_attr
,
NULL
,
0
,
NULL
,
thread_descr
);
return
NtCreateUserProcess
(
&
info
->
Process
,
&
info
->
Thread
,
PROCESS_ALL_ACCESS
,
THREAD_ALL_ACCESS
,
&
process_attr
,
&
thread_attr
,
inherit
?
PROCESS_CREATE_FLAGS_INHERIT_HANDLES
:
0
,
THREAD_CREATE_FLAGS_CREATE_SUSPENDED
,
params
,
&
create_info
,
attr
);
}
/***********************************************************************
* DbgUiRemoteBreakin (NTDLL.@)
*/
...
...
include/winternl.h
View file @
84d25135
...
...
@@ -2442,6 +2442,18 @@ typedef struct _SYSTEM_MODULE_INFORMATION
SYSTEM_MODULE
Modules
[
1
];
/* FIXME: should be Modules[0] */
}
SYSTEM_MODULE_INFORMATION
,
*
PSYSTEM_MODULE_INFORMATION
;
#define PROCESS_CREATE_FLAGS_BREAKAWAY 0x00000001
#define PROCESS_CREATE_FLAGS_NO_DEBUG_INHERIT 0x00000002
#define PROCESS_CREATE_FLAGS_INHERIT_HANDLES 0x00000004
#define PROCESS_CREATE_FLAGS_OVERRIDE_ADDRESS_SPACE 0x00000008
#define PROCESS_CREATE_FLAGS_LARGE_PAGES 0x00000010
#define PROCESS_CREATE_FLAGS_LARGE_PAGE_SYSTEM_DLL 0x00000020
#define PROCESS_CREATE_FLAGS_PROTECTED_PROCESS 0x00000040
#define PROCESS_CREATE_FLAGS_CREATE_SESSION 0x00000080
#define PROCESS_CREATE_FLAGS_INHERIT_FROM_PARENT 0x00000100
#define PROCESS_CREATE_FLAGS_SUSPENDED 0x00000200
#define PROCESS_CREATE_FLAGS_EXTENDED_UNKNOWN 0x00000400
#define THREAD_CREATE_FLAGS_CREATE_SUSPENDED 0x00000001
#define THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH 0x00000002
#define THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER 0x00000004
...
...
@@ -2453,9 +2465,9 @@ typedef LONG (CALLBACK *PRTL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS);
typedef
void
(
CALLBACK
*
PTP_IO_CALLBACK
)(
PTP_CALLBACK_INSTANCE
,
void
*
,
void
*
,
IO_STATUS_BLOCK
*
,
PTP_IO
);
#define PS_ATTRIBUTE_THREAD 0x00010000
#define PS_ATTRIBUTE_INPUT 0x00020000
#define PS_ATTRIBUTE_
UNKNOWN
0x00040000
#define PS_ATTRIBUTE_THREAD
0x00010000
#define PS_ATTRIBUTE_INPUT
0x00020000
#define PS_ATTRIBUTE_
ADDITIVE
0x00040000
typedef
enum
_PS_ATTRIBUTE_NUM
{
...
...
@@ -2479,10 +2491,41 @@ typedef enum _PS_ATTRIBUTE_NUM
PsAttributeProtectionLevel
,
PsAttributeSecureProcess
,
PsAttributeJobList
,
PsAttributeChildProcessPolicy
,
PsAttributeAllApplicationPackagesPolicy
,
PsAttributeWin32kFilter
,
PsAttributeSafeOpenPromptOriginClaim
,
PsAttributeBnoIsolation
,
PsAttributeDesktopAppPolicy
,
PsAttributeChpe
,
PsAttributeMax
}
PS_ATTRIBUTE_NUM
;
#define PS_ATTRIBUTE_CLIENT_ID (PsAttributeClientId | PS_ATTRIBUTE_THREAD)
#define PS_ATTRIBUTE_PARENT_PROCESS (PsAttributeParentProcess | PS_ATTRIBUTE_INPUT | PS_ATTRIBUTE_ADDITIVE)
#define PS_ATTRIBUTE_DEBUG_PORT (PsAttributeDebugPort | PS_ATTRIBUTE_INPUT | PS_ATTRIBUTE_ADDITIVE)
#define PS_ATTRIBUTE_TOKEN (PsAttributeToken | PS_ATTRIBUTE_INPUT | PS_ATTRIBUTE_ADDITIVE)
#define PS_ATTRIBUTE_CLIENT_ID (PsAttributeClientId | PS_ATTRIBUTE_THREAD)
#define PS_ATTRIBUTE_TEB_ADDRESS (PsAttributeTebAddress | PS_ATTRIBUTE_THREAD)
#define PS_ATTRIBUTE_IMAGE_NAME (PsAttributeImageName | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_IMAGE_INFO (PsAttributeImageInfo)
#define PS_ATTRIBUTE_MEMORY_RESERVE (PsAttributeMemoryReserve | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_PRIORITY_CLASS (PsAttributePriorityClass | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_ERROR_MODE (PsAttributeErrorMode | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_STD_HANDLE_INFO (PsAttributeStdHandleInfo | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_HANDLE_LIST (PsAttributeHandleList | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_GROUP_AFFINITY (PsAttributeGroupAffinity | PS_ATTRIBUTE_THREAD | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_PREFERRED_NODE (PsAttributePreferredNode | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_IDEAL_PROCESSOR (PsAttributeIdealProcessor | PS_ATTRIBUTE_THREAD | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_MITIGATION_OPTIONS (PsAttributeMitigationOptions | PS_ATTRIBUTE_INPUT | PS_ATTRIBUTE_UNKNOWN)
#define PS_ATTRIBUTE_PROTECTION_LEVEL (PsAttributeProtectionLevel | PS_ATTRIBUTE_INPUT | PS_ATTRIBUTE_UNKNOWN)
#define PS_ATTRIBUTE_SECURE_PROCESS (PsAttributeSecureProcess | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_JOB_LIST (PsAttributeJobList | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_CHILD_PROCESS_POLICY (PsAttributeChildProcessPolicy | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_ALL_APPLICATION_PACKAGES_POLICY (PsAttributeAllApplicationPackagesPolicy | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_WIN32K_FILTER (PsAttributeWin32kFilter | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_SAFE_OPEN_PROMPT_ORIGIN_CLAIM (PsAttributeSafeOpenPromptOriginClaim | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_BNO_ISOLATION (PsAttributeBnoIsolation | PS_ATTRIBUTE_INPUT)
#define PS_ATTRIBUTE_DESKTOP_APP_POLICY (PsAttributeDesktopAppPolicy | PS_ATTRIBUTE_INPUT)
typedef
struct
_PS_ATTRIBUTE
{
...
...
@@ -2502,6 +2545,84 @@ typedef struct _PS_ATTRIBUTE_LIST
PS_ATTRIBUTE
Attributes
[
1
];
}
PS_ATTRIBUTE_LIST
,
*
PPS_ATTRIBUTE_LIST
;
typedef
enum
_PS_CREATE_STATE
{
PsCreateInitialState
,
PsCreateFailOnFileOpen
,
PsCreateFailOnSectionCreate
,
PsCreateFailExeFormat
,
PsCreateFailMachineMismatch
,
PsCreateFailExeName
,
PsCreateSuccess
,
PsCreateMaximumStates
}
PS_CREATE_STATE
;
typedef
struct
_PS_CREATE_INFO
{
SIZE_T
Size
;
PS_CREATE_STATE
State
;
union
{
struct
{
union
{
ULONG
InitFlags
;
struct
{
UCHAR
WriteOutputOnExit
:
1
;
UCHAR
DetectManifest
:
1
;
UCHAR
IFEOSkipDebugger
:
1
;
UCHAR
IFEODoNotPropagateKeyState
:
1
;
UCHAR
SpareBits1
:
4
;
UCHAR
SpareBits2
:
8
;
USHORT
ProhibitedImageCharacteristics
:
16
;
};
};
ACCESS_MASK
AdditionalFileAccess
;
}
InitState
;
struct
{
HANDLE
FileHandle
;
}
FailSection
;
struct
{
USHORT
DllCharacteristics
;
}
ExeFormat
;
struct
{
HANDLE
IFEOKey
;
}
ExeName
;
struct
{
union
{
ULONG
OutputFlags
;
struct
{
UCHAR
ProtectedProcess
:
1
;
UCHAR
AddressSpaceOverride
:
1
;
UCHAR
DevOverrideEnabled
:
1
;
UCHAR
ManifestDetected
:
1
;
UCHAR
ProtectedProcessLight
:
1
;
UCHAR
SpareBits1
:
3
;
UCHAR
SpareBits2
:
8
;
USHORT
SpareBits3
:
16
;
};
};
HANDLE
FileHandle
;
HANDLE
SectionHandle
;
ULONGLONG
UserProcessParametersNative
;
ULONG
UserProcessParametersWow64
;
ULONG
CurrentParameterFlags
;
ULONGLONG
PebAddressNative
;
ULONG
PebAddressWow64
;
ULONGLONG
ManifestAddress
;
ULONG
ManifestSize
;
}
SuccessState
;
};
}
PS_CREATE_INFO
,
*
PPS_CREATE_INFO
;
/***********************************************************************
* Function declarations
*/
...
...
@@ -2585,6 +2706,7 @@ NTSYSAPI NTSTATUS WINAPI NtCreateThread(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,
NTSYSAPI
NTSTATUS
WINAPI
NtCreateThreadEx
(
HANDLE
*
,
ACCESS_MASK
,
OBJECT_ATTRIBUTES
*
,
HANDLE
,
PRTL_THREAD_START_ROUTINE
,
void
*
,
ULONG
,
SIZE_T
,
SIZE_T
,
SIZE_T
,
PS_ATTRIBUTE_LIST
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtCreateTimer
(
HANDLE
*
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
,
TIMER_TYPE
);
NTSYSAPI
NTSTATUS
WINAPI
NtCreateToken
(
PHANDLE
,
ACCESS_MASK
,
POBJECT_ATTRIBUTES
,
TOKEN_TYPE
,
PLUID
,
PLARGE_INTEGER
,
PTOKEN_USER
,
PTOKEN_GROUPS
,
PTOKEN_PRIVILEGES
,
PTOKEN_OWNER
,
PTOKEN_PRIMARY_GROUP
,
PTOKEN_DEFAULT_DACL
,
PTOKEN_SOURCE
);
NTSYSAPI
NTSTATUS
WINAPI
NtCreateUserProcess
(
HANDLE
*
,
HANDLE
*
,
ACCESS_MASK
,
ACCESS_MASK
,
OBJECT_ATTRIBUTES
*
,
OBJECT_ATTRIBUTES
*
,
ULONG
,
ULONG
,
RTL_USER_PROCESS_PARAMETERS
*
,
PS_CREATE_INFO
*
,
PS_ATTRIBUTE_LIST
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtDelayExecution
(
BOOLEAN
,
const
LARGE_INTEGER
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtDeleteAtom
(
RTL_ATOM
);
NTSYSAPI
NTSTATUS
WINAPI
NtDeleteFile
(
POBJECT_ATTRIBUTES
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment