turborex 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +674 -0
- data/README.md +38 -0
- data/README.rdoc +19 -0
- data/examples/alpc_client.rb +15 -0
- data/examples/alpc_server.rb +14 -0
- data/examples/com_client.rb +19 -0
- data/examples/com_finder.rb +39 -0
- data/examples/create_instance.rb +15 -0
- data/examples/cstruct.rb +19 -0
- data/examples/find_com_client_calls.rb +16 -0
- data/examples/find_rpc_security_callback.rb +12 -0
- data/examples/rpc_finder.rb +117 -0
- data/examples/scan_exports.rb +5 -0
- data/examples/scan_imports.rb +5 -0
- data/examples/tinysdk.rb +17 -0
- data/lib/turborex.rb +21 -0
- data/lib/turborex/cstruct.rb +565 -0
- data/lib/turborex/cstruct/struct_helper.rb +7 -0
- data/lib/turborex/exception.rb +65 -0
- data/lib/turborex/fuzzer.rb +204 -0
- data/lib/turborex/fuzzer/containers.rb +115 -0
- data/lib/turborex/fuzzer/coverage.rb +67 -0
- data/lib/turborex/fuzzer/mutators.rb +25 -0
- data/lib/turborex/fuzzer/seed.rb +30 -0
- data/lib/turborex/monkey.rb +11 -0
- data/lib/turborex/msrpc.rb +14 -0
- data/lib/turborex/msrpc/decompiler.rb +244 -0
- data/lib/turborex/msrpc/midl.rb +747 -0
- data/lib/turborex/msrpc/ndrtype.rb +167 -0
- data/lib/turborex/msrpc/rpcbase.rb +777 -0
- data/lib/turborex/msrpc/rpcfinder.rb +1426 -0
- data/lib/turborex/msrpc/utils.rb +70 -0
- data/lib/turborex/pefile.rb +8 -0
- data/lib/turborex/pefile/pe.rb +61 -0
- data/lib/turborex/pefile/scanner.rb +82 -0
- data/lib/turborex/utils.rb +321 -0
- data/lib/turborex/windows.rb +402 -0
- data/lib/turborex/windows/alpc.rb +844 -0
- data/lib/turborex/windows/com.rb +266 -0
- data/lib/turborex/windows/com/client.rb +84 -0
- data/lib/turborex/windows/com/com_finder.rb +330 -0
- data/lib/turborex/windows/com/com_registry.rb +100 -0
- data/lib/turborex/windows/com/interface.rb +522 -0
- data/lib/turborex/windows/com/utils.rb +210 -0
- data/lib/turborex/windows/constants.rb +82 -0
- data/lib/turborex/windows/process.rb +56 -0
- data/lib/turborex/windows/security.rb +12 -0
- data/lib/turborex/windows/security/ace.rb +76 -0
- data/lib/turborex/windows/security/acl.rb +25 -0
- data/lib/turborex/windows/security/security_descriptor.rb +118 -0
- data/lib/turborex/windows/tinysdk.rb +89 -0
- data/lib/turborex/windows/utils.rb +138 -0
- data/resources/headers/alpc/ntdef.h +72 -0
- data/resources/headers/alpc/ntlpcapi.h +1014 -0
- data/resources/headers/rpc/common.h +162 -0
- data/resources/headers/rpc/guiddef.h +191 -0
- data/resources/headers/rpc/internal_ndrtypes.h +262 -0
- data/resources/headers/rpc/rpc.h +10 -0
- data/resources/headers/rpc/rpcdce.h +266 -0
- data/resources/headers/rpc/rpcdcep.h +187 -0
- data/resources/headers/rpc/rpcndr.h +39 -0
- data/resources/headers/rpc/v4_x64/rpcinternals.h +154 -0
- data/resources/headers/rpc/wintype.h +517 -0
- data/resources/headers/tinysdk/tinysdk.h +5 -0
- data/resources/headers/tinysdk/tinysdk/comdef.h +645 -0
- data/resources/headers/tinysdk/tinysdk/dbghelp.h +118 -0
- data/resources/headers/tinysdk/tinysdk/guiddef.h +194 -0
- data/resources/headers/tinysdk/tinysdk/memoryapi.h +12 -0
- data/resources/headers/tinysdk/tinysdk/poppack.h +12 -0
- data/resources/headers/tinysdk/tinysdk/pshpack4.h +13 -0
- data/resources/headers/tinysdk/tinysdk/winnt.h +1059 -0
- data/resources/headers/tinysdk/tinysdk/wintype.h +326 -0
- metadata +290 -0
@@ -0,0 +1,118 @@
|
|
1
|
+
module TurboRex
|
2
|
+
class Windows < Metasm::WinOS
|
3
|
+
module Security
|
4
|
+
class SecurityDescriptor
|
5
|
+
attr_reader :revision
|
6
|
+
attr_reader :sbzl
|
7
|
+
attr_reader :control
|
8
|
+
attr_reader :owner
|
9
|
+
attr_reader :group
|
10
|
+
attr_reader :sacl
|
11
|
+
attr_reader :dacl
|
12
|
+
|
13
|
+
def initialize(revision, control, owner, group, sacl, dacl, sbzl=0)
|
14
|
+
@revision = revision
|
15
|
+
@sbzl = sbzl
|
16
|
+
@control = control
|
17
|
+
@owner = owner
|
18
|
+
@group = group
|
19
|
+
@sacl = sacl
|
20
|
+
@dacl = dacl
|
21
|
+
end
|
22
|
+
|
23
|
+
# Very few robustness checks, may result in memory-corruption.
|
24
|
+
def self.from_raw(raw)
|
25
|
+
apiproxy_klass = TurboRex::Windows::Win32API
|
26
|
+
sd = apiproxy_klass.alloc_c_ary('BYTE', raw.bytesize)
|
27
|
+
sd.str = raw
|
28
|
+
|
29
|
+
# Get security descriptor control and revision
|
30
|
+
pcontrol = apiproxy_klass.alloc_c_ptr('SECURITY_DESCRIPTOR_CONTROL')
|
31
|
+
prevision = apiproxy_klass.alloc_c_ptr('DWORD')
|
32
|
+
if apiproxy_klass.getsecuritydescriptorcontrol(sd, pcontrol, prevision) == 0
|
33
|
+
raise_api_call_failure('GetSecurityDescriptorControl')
|
34
|
+
end
|
35
|
+
control = pcontrol[0]
|
36
|
+
revision = prevision[0]
|
37
|
+
|
38
|
+
# Get owner sid
|
39
|
+
ppsid = apiproxy_klass.alloc_c_ptr('PSID')
|
40
|
+
pownder_default = apiproxy_klass.alloc_c_ptr('BOOL')
|
41
|
+
if apiproxy_klass.getsecuritydescriptorowner(sd, ppsid, pownder_default) == 0
|
42
|
+
raise_api_call_failure('GetSecurityDescriptorOwner')
|
43
|
+
end
|
44
|
+
|
45
|
+
ppszsid = apiproxy_klass.alloc_c_ptr('LPSTR')
|
46
|
+
if apiproxy_klass.convertsidtostringsida(ppsid[0], ppszsid) == 0
|
47
|
+
raise_api_call_failure('ConvertSidToStringSidA')
|
48
|
+
end
|
49
|
+
sz_owner_sid = apiproxy_klass.memory_read_strz(ppszsid[0])
|
50
|
+
|
51
|
+
# Get group sid
|
52
|
+
if apiproxy_klass.getsecuritydescriptorgroup(sd, ppsid, pownder_default) == 0
|
53
|
+
raise_api_call_failure('GetSecurityDescriptorGroup')
|
54
|
+
end
|
55
|
+
|
56
|
+
ppszsid = apiproxy_klass.alloc_c_ptr('LPSTR')
|
57
|
+
if apiproxy_klass.convertsidtostringsida(ppsid[0], ppszsid) == 0
|
58
|
+
raise_api_call_failure('ConvertSidToStringSidA')
|
59
|
+
end
|
60
|
+
sz_group_sid = apiproxy_klass.memory_read_strz(ppszsid[0])
|
61
|
+
|
62
|
+
# TODO: parse SACL
|
63
|
+
|
64
|
+
|
65
|
+
# Get DACL
|
66
|
+
ppacl = apiproxy_klass.alloc_c_ptr('PACL')
|
67
|
+
dacl_present = apiproxy_klass.alloc_c_ptr('BOOL')
|
68
|
+
pdacl_default = apiproxy_klass.alloc_c_ptr('BOOL')
|
69
|
+
if apiproxy_klass.getsecuritydescriptordacl(sd, dacl_present, ppacl, pdacl_default) == 0
|
70
|
+
raise_api_call_failure('GetSecurityDescriptorDacl')
|
71
|
+
end
|
72
|
+
|
73
|
+
acl_revision_info = apiproxy_klass.alloc_c_struct('ACL_REVISION_INFORMATION')
|
74
|
+
if apiproxy_klass.getaclinformation(ppacl[0], acl_revision_info, acl_revision_info.sizeof, apiproxy_klass::ACLREVISIONINFORMATION) == 0
|
75
|
+
raise_api_call_failure('GetAclInformation')
|
76
|
+
end
|
77
|
+
acl_revision = acl_revision_info.AclRevision
|
78
|
+
|
79
|
+
acl_size_info = apiproxy_klass.alloc_c_struct('ACL_SIZE_INFORMATION')
|
80
|
+
if apiproxy_klass.getaclinformation(ppacl[0], acl_size_info, acl_size_info.sizeof, apiproxy_klass::ACLSIZEINFORMATION) == 0
|
81
|
+
raise_api_call_failure('GetAclInformation')
|
82
|
+
end
|
83
|
+
ace_count = acl_size_info.AceCount
|
84
|
+
|
85
|
+
ppace = apiproxy_klass.alloc_c_ptr('LPVOID')
|
86
|
+
aces = []
|
87
|
+
ace_count.times do |i|
|
88
|
+
if apiproxy_klass.getace(ppacl[0], i, ppace) == 0
|
89
|
+
raise_api_call_failure('GetACE')
|
90
|
+
end
|
91
|
+
|
92
|
+
# parse ace
|
93
|
+
aces << parse_ace_from_ptr(ppace[0])
|
94
|
+
end
|
95
|
+
|
96
|
+
dacl = ACL::DACL.new(acl_revision, ace_count, aces)
|
97
|
+
|
98
|
+
new(revision, control, sz_owner_sid, sz_group_sid, nil, dacl)
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
def self.raise_api_call_failure(api_name)
|
103
|
+
raise "Unable to call #{api_name}. GetLastError returns: #{TurboRex::Windows::Win32API.getlasterror}"
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.parse_ace_from_ptr(ptr)
|
107
|
+
ace_header = TurboRex::Windows::Win32API.alloc_c_struct('ACE_HEADER')
|
108
|
+
raw_header = TurboRex::Windows::Utils.read_memory(ptr, ace_header.sizeof)
|
109
|
+
ace_header.str = raw_header
|
110
|
+
size = ace_header.AceSize
|
111
|
+
|
112
|
+
raw_ace = TurboRex::Windows::Utils.read_memory(ptr, size)
|
113
|
+
ACE.from_raw(raw_ace)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module TurboRex
|
4
|
+
class Windows < Metasm::WinOS
|
5
|
+
def self.tinysdk
|
6
|
+
TurboRex::Windows::TinySDK.instance
|
7
|
+
end
|
8
|
+
|
9
|
+
class TinySDK
|
10
|
+
DEFAULT_LOAD_FILE = TurboRex.root + '/resources/headers/tinysdk/tinysdk.h'
|
11
|
+
|
12
|
+
include Singleton
|
13
|
+
|
14
|
+
attr_reader :include_path
|
15
|
+
attr_reader :loaded_files
|
16
|
+
attr_reader :np
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@loaded = false
|
20
|
+
@loaded_files = []
|
21
|
+
set_include_path
|
22
|
+
end
|
23
|
+
|
24
|
+
def load(opts = {})
|
25
|
+
return true if loaded?
|
26
|
+
load!(opts)
|
27
|
+
end
|
28
|
+
|
29
|
+
def load!(opts)
|
30
|
+
opts[:cpu] ||= ::Metasm::Ia32
|
31
|
+
|
32
|
+
opts[:visual_studio] = true
|
33
|
+
opts[:data_model] = 'llp64' if opts[:cpu] == Metasm::X86_64
|
34
|
+
opts[:predefined] = true
|
35
|
+
|
36
|
+
@np = TurboRex::CStruct::NativeParser.new(nil, opts)
|
37
|
+
@cp = @np.parser
|
38
|
+
|
39
|
+
if opts[:files]
|
40
|
+
opts[:files].each {|f| @cp.parse_file(f)}
|
41
|
+
@loaded_files = opts[:files]
|
42
|
+
else
|
43
|
+
@cp.parse_file(DEFAULT_LOAD_FILE)
|
44
|
+
@loaded_files << DEFAULT_LOAD_FILE
|
45
|
+
end
|
46
|
+
|
47
|
+
true
|
48
|
+
end
|
49
|
+
|
50
|
+
def loaded?
|
51
|
+
@loaded
|
52
|
+
end
|
53
|
+
|
54
|
+
## https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/using-ntstatus-values
|
55
|
+
def self.nt_success?(ntstatus)
|
56
|
+
(0..0x3FFFFFFF).include?(ntstatus) || (0x40000000..0x7FFFFFFF).include?(ntstatus) || ntstatus.nil?
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.nt_information?(ntstatus)
|
60
|
+
(0x40000000..0x7FFFFFFF).include?(ntstatus)
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.nt_warning?(ntstatus)
|
64
|
+
(0x80000000..0xBFFFFFFF).include?(ntstatus)
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.nt_error?(ntstatus)
|
68
|
+
(0xC0000000..0xFFFFFFFF).include?(ntstatus)
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.format_hex_ntstatus(integer, opts = {})
|
72
|
+
integer = 0 unless integer
|
73
|
+
unpacked = [integer].pack('V').unpack('V')[0]
|
74
|
+
if opts[:hex_str]
|
75
|
+
'0x' + unpacked.to_s(16).upcase
|
76
|
+
else
|
77
|
+
unpacked
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def set_include_path
|
84
|
+
root = TurboRex.root + '/resources/headers'
|
85
|
+
@include_path = TurboRex::Utils.get_all_subdir(root)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'turborex/cstruct'
|
2
|
+
module TurboRex
|
3
|
+
class Windows < Metasm::WinOS
|
4
|
+
module Utils
|
5
|
+
include ::Win32 if ::OS.windows?
|
6
|
+
include TurboRex::CStruct
|
7
|
+
|
8
|
+
def get_version(path)
|
9
|
+
structmgr = define_structs do
|
10
|
+
struct tagVS_FIXEDFILEINFO {
|
11
|
+
DWORD dwSignature;
|
12
|
+
DWORD dwStrucVersion;
|
13
|
+
DWORD dwFileVersionMS;
|
14
|
+
DWORD dwFileVersionLS;
|
15
|
+
DWORD dwProductVersionMS;
|
16
|
+
DWORD dwProductVersionLS;
|
17
|
+
DWORD dwFileFlagsMask;
|
18
|
+
DWORD dwFileFlags;
|
19
|
+
DWORD dwFileOS;
|
20
|
+
DWORD dwFileType;
|
21
|
+
DWORD dwFileSubtype;
|
22
|
+
DWORD dwFileDateMS;
|
23
|
+
DWORD dwFileDateLS;
|
24
|
+
};
|
25
|
+
end
|
26
|
+
|
27
|
+
fGetFileVersionInfoSize = API.new('GetFileVersionInfoSize', 'PP', 'L', 'version')
|
28
|
+
lpdwHandle = 0
|
29
|
+
lptstrFilename = path
|
30
|
+
buf_len = fGetFileVersionInfoSize.call(lptstrFilename, lpdwHandle)
|
31
|
+
|
32
|
+
fGetFileVersionInfo = API.new('GetFileVersionInfo', 'PLLP', 'I', 'version')
|
33
|
+
buf = 0.chr * buf_len
|
34
|
+
res = fGetFileVersionInfo.call(lptstrFilename, 0, buf_len, buf)
|
35
|
+
|
36
|
+
if res == 1
|
37
|
+
fVerQueryValueW = API.new('VerQueryValue', 'PPPP', 'I', 'version')
|
38
|
+
fileInfo = 0.chr * 8
|
39
|
+
size = 0.chr * 4
|
40
|
+
lpSubBlock = '\\'
|
41
|
+
res = fVerQueryValueW.call(buf, lpSubBlock, fileInfo, size)
|
42
|
+
|
43
|
+
if res == 1
|
44
|
+
fReadProcessMemory = API.new('ReadProcessMemory', 'LPPPP', 'I', 'kernel32')
|
45
|
+
size_i = size.unpack('V')[0]
|
46
|
+
buf = 0.chr * size_i
|
47
|
+
i1 = 0.chr * 8
|
48
|
+
fReadProcessMemory.call(-1, fileInfo.unpack('Q<')[0], buf, size_i, i1)
|
49
|
+
moduleVersion = structmgr['tagVS_FIXEDFILEINFO'].from_str buf
|
50
|
+
return [moduleVersion['dwFileVersionMS'].value, moduleVersion['dwFileVersionLS'].value]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.multibyte_to_widechar(str)
|
56
|
+
fMultiByteToWideChar = API.new('MultiByteToWideChar', 'ILSIPI', 'I', 'kernel32')
|
57
|
+
code_page = 65001 # CP_UTF8
|
58
|
+
flag = 0
|
59
|
+
ilength = fMultiByteToWideChar.call(code_page, flag, str, -1, 0, 0)
|
60
|
+
return false if ilength == 0
|
61
|
+
|
62
|
+
buf = 0.chr * ilength * 2
|
63
|
+
res = fMultiByteToWideChar.call(code_page, flag, str, -1, buf, ilength)
|
64
|
+
return false if res == 0
|
65
|
+
buf
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.read_memory(base, size, handle = -1)
|
69
|
+
fReadProcessMemory = API.new('ReadProcessMemory', 'LPPPP', 'I', 'kernel32')
|
70
|
+
i1 = 0.chr * 8
|
71
|
+
buf = 0.chr * size
|
72
|
+
if fReadProcessMemory.call(handle, base, buf, size, i1) == 1
|
73
|
+
buf
|
74
|
+
else
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.is_wow64?
|
80
|
+
fIsWow64Process = API.new('IsWow64Process', 'PP', 'I', 'kernel32')
|
81
|
+
wow64 = 0.chr
|
82
|
+
raise "Failed to call IsWow64Process" if fIsWow64Process.call(-1, wow64) == 0
|
83
|
+
|
84
|
+
wow64.unpack('C').first == 1
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.process_arch(pid=nil, handle=-1)
|
88
|
+
case Metasm::WinOS::Process.new(pid, handle).addrsz / 8
|
89
|
+
when 4
|
90
|
+
'x86'
|
91
|
+
when 8
|
92
|
+
'x64'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.process_arch_x64?(pid=nil, handle=-1)
|
97
|
+
Metasm::WinOS::Process.new(pid, handle).addrsz / 8 == 8
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.find_import_func(func, filenames, stop_when_found = false)
|
101
|
+
found = []
|
102
|
+
filenames.each do |f|
|
103
|
+
dfile = ::Metasm::PE.decode_file_header f
|
104
|
+
dfile.decode_imports
|
105
|
+
imports = dfile.imports
|
106
|
+
next if not imports
|
107
|
+
imports.each do |import_dict|
|
108
|
+
import_dict.imports.each do |import_desc|
|
109
|
+
if import_desc.name == func
|
110
|
+
return f if stop_when_found
|
111
|
+
found << f
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
found
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.find_export_func(func, filenames, stop_when_found = false)
|
121
|
+
found = []
|
122
|
+
filenames.each do |f|
|
123
|
+
dfile = ::Metasm::PE.decode_file_header f
|
124
|
+
dfile.decode_exports
|
125
|
+
export = dfile.export
|
126
|
+
next if !export
|
127
|
+
next if !export.exports
|
128
|
+
export.exports.each do |exp|
|
129
|
+
if exp.name == func && !exp.forwarder_lib
|
130
|
+
return f if stop_when_found
|
131
|
+
found << f
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#include <tinysdk/wintype.h>
|
2
|
+
#include <tinysdk/winnt.h>
|
3
|
+
|
4
|
+
#define _Out_
|
5
|
+
#define _In_opt_
|
6
|
+
#define _Inout_
|
7
|
+
#define _Out_opt_
|
8
|
+
#define _In_
|
9
|
+
#define _Inout_opt_
|
10
|
+
#define _Reserved_
|
11
|
+
|
12
|
+
typedef struct _OBJECT_ATTRIBUTES {
|
13
|
+
ULONG Length;
|
14
|
+
HANDLE RootDirectory;
|
15
|
+
PUNICODE_STRING ObjectName;
|
16
|
+
ULONG Attributes;
|
17
|
+
PVOID SecurityDescriptor;
|
18
|
+
PVOID SecurityQualityOfService;
|
19
|
+
} OBJECT_ATTRIBUTES;
|
20
|
+
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
|
21
|
+
|
22
|
+
typedef short CSHORT;
|
23
|
+
#if !defined(_M_IX86)
|
24
|
+
typedef __int64 LONGLONG;
|
25
|
+
typedef unsigned __int64 ULONGLONG;
|
26
|
+
#else
|
27
|
+
typedef double LONGLONG;
|
28
|
+
typedef double ULONGLONG;
|
29
|
+
#endif
|
30
|
+
|
31
|
+
/*
|
32
|
+
typedef union _LARGE_INTEGER {
|
33
|
+
struct {
|
34
|
+
DWORD LowPart;
|
35
|
+
LONG HighPart;
|
36
|
+
} DUMMYSTRUCTNAME;
|
37
|
+
struct {
|
38
|
+
DWORD LowPart;
|
39
|
+
LONG HighPart;
|
40
|
+
} u;
|
41
|
+
LONGLONG QuadPart;
|
42
|
+
} LARGE_INTEGER, *PLARGE_INTEGER;
|
43
|
+
*/
|
44
|
+
|
45
|
+
typedef struct _CLIENT_ID
|
46
|
+
{
|
47
|
+
HANDLE UniqueProcess;
|
48
|
+
HANDLE UniqueThread;
|
49
|
+
} CLIENT_ID, *PCLIENT_ID;
|
50
|
+
|
51
|
+
typedef struct _CLIENT_ID32
|
52
|
+
{
|
53
|
+
ULONG UniqueProcess;
|
54
|
+
ULONG UniqueThread;
|
55
|
+
} CLIENT_ID32, *PCLIENT_ID32;
|
56
|
+
|
57
|
+
typedef struct _CLIENT_ID64
|
58
|
+
{
|
59
|
+
ULONGLONG UniqueProcess;
|
60
|
+
ULONGLONG UniqueThread;
|
61
|
+
} CLIENT_ID64, *PCLIENT_ID64;
|
62
|
+
|
63
|
+
// from thread
|
64
|
+
typedef struct _RTL_SRWLOCK {
|
65
|
+
PVOID Ptr;
|
66
|
+
} RTL_SRWLOCK, *PRTL_SRWLOCK;
|
67
|
+
typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
|
68
|
+
|
69
|
+
void RtlInitUnicodeString(
|
70
|
+
PUNICODE_STRING DestinationString,
|
71
|
+
PCWSTR SourceString
|
72
|
+
);
|
@@ -0,0 +1,1014 @@
|
|
1
|
+
#include <ntdef.h>
|
2
|
+
|
3
|
+
//from ProcessHacker
|
4
|
+
#define NT_WIN2K 50
|
5
|
+
#define NT_WINXP 51
|
6
|
+
#define NT_WS03 52
|
7
|
+
#define NT_VISTA 60
|
8
|
+
#define NT_WIN7 61
|
9
|
+
#define NT_WIN8 62
|
10
|
+
#define NT_WINBLUE 63
|
11
|
+
#define NT_THRESHOLD 100
|
12
|
+
#ifndef _NTLPCAPI_H
|
13
|
+
#define _NTLPCAPI_H
|
14
|
+
|
15
|
+
// Local Inter-process Communication
|
16
|
+
|
17
|
+
#define PORT_CONNECT 0x0001
|
18
|
+
#define PORT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1)
|
19
|
+
#define DECLSPEC_ALIGN(x) __declspec(align(x))
|
20
|
+
|
21
|
+
typedef struct _PORT_MESSAGE
|
22
|
+
{
|
23
|
+
union
|
24
|
+
{
|
25
|
+
struct
|
26
|
+
{
|
27
|
+
CSHORT DataLength;
|
28
|
+
CSHORT TotalLength;
|
29
|
+
} s1;
|
30
|
+
ULONG Length;
|
31
|
+
} u1;
|
32
|
+
union
|
33
|
+
{
|
34
|
+
struct
|
35
|
+
{
|
36
|
+
CSHORT Type;
|
37
|
+
CSHORT DataInfoOffset;
|
38
|
+
} s2;
|
39
|
+
ULONG ZeroInit;
|
40
|
+
} u2;
|
41
|
+
union
|
42
|
+
{
|
43
|
+
CLIENT_ID ClientId;
|
44
|
+
double DoNotUseThisField;
|
45
|
+
};
|
46
|
+
ULONG MessageId;
|
47
|
+
union
|
48
|
+
{
|
49
|
+
SIZE_T ClientViewSize; // only valid for LPC_CONNECTION_REQUEST messages
|
50
|
+
ULONG CallbackId; // only valid for LPC_REQUEST messages
|
51
|
+
};
|
52
|
+
} PORT_MESSAGE, *PPORT_MESSAGE;
|
53
|
+
|
54
|
+
typedef struct _PORT_DATA_ENTRY
|
55
|
+
{
|
56
|
+
PVOID Base;
|
57
|
+
ULONG Size;
|
58
|
+
} PORT_DATA_ENTRY, *PPORT_DATA_ENTRY;
|
59
|
+
|
60
|
+
typedef struct _PORT_DATA_INFORMATION
|
61
|
+
{
|
62
|
+
ULONG CountDataEntries;
|
63
|
+
PORT_DATA_ENTRY DataEntries[1];
|
64
|
+
} PORT_DATA_INFORMATION, *PPORT_DATA_INFORMATION;
|
65
|
+
|
66
|
+
#define LPC_REQUEST 1
|
67
|
+
#define LPC_REPLY 2
|
68
|
+
#define LPC_DATAGRAM 3
|
69
|
+
#define LPC_LOST_REPLY 4
|
70
|
+
#define LPC_PORT_CLOSED 5
|
71
|
+
#define LPC_CLIENT_DIED 6
|
72
|
+
#define LPC_EXCEPTION 7
|
73
|
+
#define LPC_DEBUG_EVENT 8
|
74
|
+
#define LPC_ERROR_EVENT 9
|
75
|
+
#define LPC_CONNECTION_REQUEST 10
|
76
|
+
|
77
|
+
#define LPC_KERNELMODE_MESSAGE (CSHORT)0x8000
|
78
|
+
#define LPC_NO_IMPERSONATE (CSHORT)0x4000
|
79
|
+
|
80
|
+
#define PORT_VALID_OBJECT_ATTRIBUTES OBJ_CASE_INSENSITIVE
|
81
|
+
|
82
|
+
#ifdef _WIN64
|
83
|
+
#define PORT_MAXIMUM_MESSAGE_LENGTH 512
|
84
|
+
#else
|
85
|
+
#define PORT_MAXIMUM_MESSAGE_LENGTH 256
|
86
|
+
#endif
|
87
|
+
|
88
|
+
#define LPC_MAX_CONNECTION_INFO_SIZE (16 * sizeof(ULONG_PTR))
|
89
|
+
|
90
|
+
#define PORT_TOTAL_MAXIMUM_MESSAGE_LENGTH \
|
91
|
+
((PORT_MAXIMUM_MESSAGE_LENGTH + sizeof(PORT_MESSAGE) + LPC_MAX_CONNECTION_INFO_SIZE + 0xf) & ~0xf)
|
92
|
+
|
93
|
+
typedef struct _LPC_CLIENT_DIED_MSG
|
94
|
+
{
|
95
|
+
PORT_MESSAGE PortMsg;
|
96
|
+
LARGE_INTEGER CreateTime;
|
97
|
+
} LPC_CLIENT_DIED_MSG, *PLPC_CLIENT_DIED_MSG;
|
98
|
+
|
99
|
+
typedef struct _PORT_VIEW
|
100
|
+
{
|
101
|
+
ULONG Length;
|
102
|
+
HANDLE SectionHandle;
|
103
|
+
ULONG SectionOffset;
|
104
|
+
SIZE_T ViewSize;
|
105
|
+
PVOID ViewBase;
|
106
|
+
PVOID ViewRemoteBase;
|
107
|
+
} PORT_VIEW, *PPORT_VIEW;
|
108
|
+
|
109
|
+
typedef struct _REMOTE_PORT_VIEW
|
110
|
+
{
|
111
|
+
ULONG Length;
|
112
|
+
SIZE_T ViewSize;
|
113
|
+
PVOID ViewBase;
|
114
|
+
} REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW;
|
115
|
+
|
116
|
+
// WOW64 definitions
|
117
|
+
|
118
|
+
// Except in a small number of special cases, WOW64 programs using the LPC APIs must use the 64-bit versions of the
|
119
|
+
// PORT_MESSAGE, PORT_VIEW and REMOTE_PORT_VIEW data structures. Note that we take a different approach than the
|
120
|
+
// official NT headers, which produce 64-bit versions in a 32-bit environment when USE_LPC6432 is defined.
|
121
|
+
|
122
|
+
typedef struct _PORT_MESSAGE64
|
123
|
+
{
|
124
|
+
union
|
125
|
+
{
|
126
|
+
struct
|
127
|
+
{
|
128
|
+
CSHORT DataLength;
|
129
|
+
CSHORT TotalLength;
|
130
|
+
} s1;
|
131
|
+
ULONG Length;
|
132
|
+
} u1;
|
133
|
+
union
|
134
|
+
{
|
135
|
+
struct
|
136
|
+
{
|
137
|
+
CSHORT Type;
|
138
|
+
CSHORT DataInfoOffset;
|
139
|
+
} s2;
|
140
|
+
ULONG ZeroInit;
|
141
|
+
} u2;
|
142
|
+
union
|
143
|
+
{
|
144
|
+
CLIENT_ID64 ClientId;
|
145
|
+
double DoNotUseThisField;
|
146
|
+
};
|
147
|
+
ULONG MessageId;
|
148
|
+
union
|
149
|
+
{
|
150
|
+
ULONGLONG ClientViewSize; // only valid for LPC_CONNECTION_REQUEST messages
|
151
|
+
ULONG CallbackId; // only valid for LPC_REQUEST messages
|
152
|
+
};
|
153
|
+
} PORT_MESSAGE64, *PPORT_MESSAGE64;
|
154
|
+
|
155
|
+
typedef struct _LPC_CLIENT_DIED_MSG64
|
156
|
+
{
|
157
|
+
PORT_MESSAGE64 PortMsg;
|
158
|
+
LARGE_INTEGER CreateTime;
|
159
|
+
} LPC_CLIENT_DIED_MSG64, *PLPC_CLIENT_DIED_MSG64;
|
160
|
+
|
161
|
+
typedef struct _PORT_VIEW64
|
162
|
+
{
|
163
|
+
ULONG Length;
|
164
|
+
ULONGLONG SectionHandle;
|
165
|
+
ULONG SectionOffset;
|
166
|
+
ULONGLONG ViewSize;
|
167
|
+
ULONGLONG ViewBase;
|
168
|
+
ULONGLONG ViewRemoteBase;
|
169
|
+
} PORT_VIEW64, *PPORT_VIEW64;
|
170
|
+
|
171
|
+
typedef struct _REMOTE_PORT_VIEW64
|
172
|
+
{
|
173
|
+
ULONG Length;
|
174
|
+
ULONGLONG ViewSize;
|
175
|
+
ULONGLONG ViewBase;
|
176
|
+
} REMOTE_PORT_VIEW64, *PREMOTE_PORT_VIEW64;
|
177
|
+
|
178
|
+
// Port creation
|
179
|
+
|
180
|
+
NTSYSCALLAPI
|
181
|
+
NTSTATUS
|
182
|
+
NTAPI
|
183
|
+
NtCreatePort(
|
184
|
+
_Out_ PHANDLE PortHandle,
|
185
|
+
_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
|
186
|
+
_In_ ULONG MaxConnectionInfoLength,
|
187
|
+
_In_ ULONG MaxMessageLength,
|
188
|
+
_In_opt_ ULONG MaxPoolUsage
|
189
|
+
);
|
190
|
+
|
191
|
+
NTSYSCALLAPI
|
192
|
+
NTSTATUS
|
193
|
+
NTAPI
|
194
|
+
NtCreateWaitablePort(
|
195
|
+
_Out_ PHANDLE PortHandle,
|
196
|
+
_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
|
197
|
+
_In_ ULONG MaxConnectionInfoLength,
|
198
|
+
_In_ ULONG MaxMessageLength,
|
199
|
+
_In_opt_ ULONG MaxPoolUsage
|
200
|
+
);
|
201
|
+
|
202
|
+
// Port connection (client)
|
203
|
+
|
204
|
+
NTSYSCALLAPI
|
205
|
+
NTSTATUS
|
206
|
+
NTAPI
|
207
|
+
NtConnectPort(
|
208
|
+
_Out_ PHANDLE PortHandle,
|
209
|
+
_In_ PUNICODE_STRING PortName,
|
210
|
+
_In_ PSECURITY_QUALITY_OF_SERVICE SecurityQos,
|
211
|
+
_Inout_opt_ PPORT_VIEW ClientView,
|
212
|
+
_Inout_opt_ PREMOTE_PORT_VIEW ServerView,
|
213
|
+
_Out_opt_ PULONG MaxMessageLength,
|
214
|
+
PVOID ConnectionInformation,
|
215
|
+
_Inout_opt_ PULONG ConnectionInformationLength
|
216
|
+
);
|
217
|
+
|
218
|
+
NTSYSCALLAPI
|
219
|
+
NTSTATUS
|
220
|
+
NTAPI
|
221
|
+
NtSecureConnectPort(
|
222
|
+
_Out_ PHANDLE PortHandle,
|
223
|
+
_In_ PUNICODE_STRING PortName,
|
224
|
+
_In_ PSECURITY_QUALITY_OF_SERVICE SecurityQos,
|
225
|
+
_Inout_opt_ PPORT_VIEW ClientView,
|
226
|
+
_In_opt_ PSID RequiredServerSid,
|
227
|
+
_Inout_opt_ PREMOTE_PORT_VIEW ServerView,
|
228
|
+
_Out_opt_ PULONG MaxMessageLength,
|
229
|
+
PVOID ConnectionInformation,
|
230
|
+
_Inout_opt_ PULONG ConnectionInformationLength
|
231
|
+
);
|
232
|
+
|
233
|
+
// Port connection (server)
|
234
|
+
|
235
|
+
NTSYSCALLAPI
|
236
|
+
NTSTATUS
|
237
|
+
NTAPI
|
238
|
+
NtListenPort(
|
239
|
+
_In_ HANDLE PortHandle,
|
240
|
+
_Out_ PPORT_MESSAGE ConnectionRequest
|
241
|
+
);
|
242
|
+
|
243
|
+
NTSYSCALLAPI
|
244
|
+
NTSTATUS
|
245
|
+
NTAPI
|
246
|
+
NtAcceptConnectPort(
|
247
|
+
_Out_ PHANDLE PortHandle,
|
248
|
+
_In_opt_ PVOID PortContext,
|
249
|
+
_In_ PPORT_MESSAGE ConnectionRequest,
|
250
|
+
_In_ BOOLEAN AcceptConnection,
|
251
|
+
_Inout_opt_ PPORT_VIEW ServerView,
|
252
|
+
_Out_opt_ PREMOTE_PORT_VIEW ClientView
|
253
|
+
);
|
254
|
+
|
255
|
+
NTSYSCALLAPI
|
256
|
+
NTSTATUS
|
257
|
+
NTAPI
|
258
|
+
NtCompleteConnectPort(
|
259
|
+
_In_ HANDLE PortHandle
|
260
|
+
);
|
261
|
+
|
262
|
+
// General
|
263
|
+
|
264
|
+
NTSYSCALLAPI
|
265
|
+
NTSTATUS
|
266
|
+
NTAPI
|
267
|
+
NtRequestPort(
|
268
|
+
_In_ HANDLE PortHandle,
|
269
|
+
PPORT_MESSAGE RequestMessage
|
270
|
+
);
|
271
|
+
|
272
|
+
NTSYSCALLAPI
|
273
|
+
NTSTATUS
|
274
|
+
NTAPI
|
275
|
+
NtRequestWaitReplyPort(
|
276
|
+
_In_ HANDLE PortHandle,
|
277
|
+
PPORT_MESSAGE RequestMessage,
|
278
|
+
_Out_ PPORT_MESSAGE ReplyMessage
|
279
|
+
);
|
280
|
+
|
281
|
+
NTSYSCALLAPI
|
282
|
+
NTSTATUS
|
283
|
+
NTAPI
|
284
|
+
NtReplyPort(
|
285
|
+
_In_ HANDLE PortHandle,
|
286
|
+
PPORT_MESSAGE ReplyMessage
|
287
|
+
);
|
288
|
+
|
289
|
+
NTSYSCALLAPI
|
290
|
+
NTSTATUS
|
291
|
+
NTAPI
|
292
|
+
NtReplyWaitReplyPort(
|
293
|
+
_In_ HANDLE PortHandle,
|
294
|
+
_Inout_ PPORT_MESSAGE ReplyMessage
|
295
|
+
);
|
296
|
+
|
297
|
+
NTSYSCALLAPI
|
298
|
+
NTSTATUS
|
299
|
+
NTAPI
|
300
|
+
NtReplyWaitReceivePort(
|
301
|
+
_In_ HANDLE PortHandle,
|
302
|
+
_Out_opt_ PVOID *PortContext,
|
303
|
+
PPORT_MESSAGE ReplyMessage,
|
304
|
+
_Out_ PPORT_MESSAGE ReceiveMessage
|
305
|
+
);
|
306
|
+
|
307
|
+
NTSYSCALLAPI
|
308
|
+
NTSTATUS
|
309
|
+
NTAPI
|
310
|
+
NtReplyWaitReceivePortEx(
|
311
|
+
_In_ HANDLE PortHandle,
|
312
|
+
_Out_opt_ PVOID *PortContext,
|
313
|
+
PPORT_MESSAGE ReplyMessage,
|
314
|
+
_Out_ PPORT_MESSAGE ReceiveMessage,
|
315
|
+
_In_opt_ PLARGE_INTEGER Timeout
|
316
|
+
);
|
317
|
+
|
318
|
+
NTSYSCALLAPI
|
319
|
+
NTSTATUS
|
320
|
+
NTAPI
|
321
|
+
NtImpersonateClientOfPort(
|
322
|
+
_In_ HANDLE PortHandle,
|
323
|
+
_In_ PPORT_MESSAGE Message
|
324
|
+
);
|
325
|
+
|
326
|
+
NTSYSCALLAPI
|
327
|
+
NTSTATUS
|
328
|
+
NTAPI
|
329
|
+
NtReadRequestData(
|
330
|
+
_In_ HANDLE PortHandle,
|
331
|
+
_In_ PPORT_MESSAGE Message,
|
332
|
+
_In_ ULONG DataEntryIndex,
|
333
|
+
PVOID Buffer,
|
334
|
+
_In_ SIZE_T BufferSize,
|
335
|
+
_Out_opt_ PSIZE_T NumberOfBytesRead
|
336
|
+
);
|
337
|
+
|
338
|
+
NTSYSCALLAPI
|
339
|
+
NTSTATUS
|
340
|
+
NTAPI
|
341
|
+
NtWriteRequestData(
|
342
|
+
_In_ HANDLE PortHandle,
|
343
|
+
_In_ PPORT_MESSAGE Message,
|
344
|
+
_In_ ULONG DataEntryIndex,
|
345
|
+
PVOID Buffer,
|
346
|
+
_In_ SIZE_T BufferSize,
|
347
|
+
_Out_opt_ PSIZE_T NumberOfBytesWritten
|
348
|
+
);
|
349
|
+
|
350
|
+
typedef enum _PORT_INFORMATION_CLASS
|
351
|
+
{
|
352
|
+
PortBasicInformation,
|
353
|
+
PortDumpInformation
|
354
|
+
} PORT_INFORMATION_CLASS;
|
355
|
+
|
356
|
+
NTSYSCALLAPI
|
357
|
+
NTSTATUS
|
358
|
+
NTAPI
|
359
|
+
NtQueryInformationPort(
|
360
|
+
_In_ HANDLE PortHandle,
|
361
|
+
_In_ PORT_INFORMATION_CLASS PortInformationClass,
|
362
|
+
PVOID PortInformation,
|
363
|
+
_In_ ULONG Length,
|
364
|
+
_Out_opt_ PULONG ReturnLength
|
365
|
+
);
|
366
|
+
|
367
|
+
// Asynchronous Local Inter-process Communication
|
368
|
+
|
369
|
+
// rev
|
370
|
+
typedef HANDLE ALPC_HANDLE, *PALPC_HANDLE;
|
371
|
+
|
372
|
+
#define ALPC_PORFLG_ALLOW_LPC_REQUESTS 0x20000 // rev
|
373
|
+
#define ALPC_PORFLG_WAITABLE_PORT 0x40000 // dbg
|
374
|
+
#define ALPC_PORFLG_SYSTEM_PROCESS 0x100000 // dbg
|
375
|
+
|
376
|
+
// symbols
|
377
|
+
typedef struct _ALPC_PORT_ATTRIBUTES
|
378
|
+
{
|
379
|
+
ULONG Flags;
|
380
|
+
SECURITY_QUALITY_OF_SERVICE SecurityQos;
|
381
|
+
SIZE_T MaxMessageLength;
|
382
|
+
SIZE_T MemoryBandwidth;
|
383
|
+
SIZE_T MaxPoolUsage;
|
384
|
+
SIZE_T MaxSectionSize;
|
385
|
+
SIZE_T MaxViewSize;
|
386
|
+
SIZE_T MaxTotalSectionSize;
|
387
|
+
ULONG DupObjectTypes;
|
388
|
+
#ifdef _WIN64
|
389
|
+
ULONG Reserved;
|
390
|
+
#endif
|
391
|
+
} ALPC_PORT_ATTRIBUTES, *PALPC_PORT_ATTRIBUTES;
|
392
|
+
|
393
|
+
// begin_rev
|
394
|
+
#define ALPC_MESSAGE_SECURITY_ATTRIBUTE 0x80000000
|
395
|
+
#define ALPC_MESSAGE_VIEW_ATTRIBUTE 0x40000000
|
396
|
+
#define ALPC_MESSAGE_CONTEXT_ATTRIBUTE 0x20000000
|
397
|
+
// from PythonForWindows
|
398
|
+
#define ALPC_MESSAGE_HANDLE_ATTRIBUTE 0x10000000
|
399
|
+
#define ALPC_MESSAGE_TOKEN_ATTRIBUTE 0x8000000
|
400
|
+
#define ALPC_MESSAGE_DIRECT_ATTRIBUTE 0x4000000
|
401
|
+
#define ALPC_MESSAGE_WORK_ON_BEHALF_ATTRIBUTE 0x2000000
|
402
|
+
// end_rev
|
403
|
+
|
404
|
+
// symbols
|
405
|
+
typedef struct _ALPC_MESSAGE_ATTRIBUTES
|
406
|
+
{
|
407
|
+
ULONG AllocatedAttributes;
|
408
|
+
ULONG ValidAttributes;
|
409
|
+
} ALPC_MESSAGE_ATTRIBUTES, *PALPC_MESSAGE_ATTRIBUTES;
|
410
|
+
|
411
|
+
// symbols
|
412
|
+
typedef struct _ALPC_COMPLETION_LIST_STATE
|
413
|
+
{
|
414
|
+
union
|
415
|
+
{
|
416
|
+
struct
|
417
|
+
{
|
418
|
+
ULONG64 Head : 24;
|
419
|
+
ULONG64 Tail : 24;
|
420
|
+
ULONG64 ActiveThreadCount : 16;
|
421
|
+
} s1;
|
422
|
+
ULONG64 Value;
|
423
|
+
} u1;
|
424
|
+
} ALPC_COMPLETION_LIST_STATE, *PALPC_COMPLETION_LIST_STATE;
|
425
|
+
|
426
|
+
#define ALPC_COMPLETION_LIST_BUFFER_GRANULARITY_MASK 0x3f // dbg
|
427
|
+
|
428
|
+
// symbols
|
429
|
+
typedef struct DECLSPEC_ALIGN(128) _ALPC_COMPLETION_LIST_HEADER
|
430
|
+
{
|
431
|
+
ULONG64 StartMagic;
|
432
|
+
|
433
|
+
ULONG TotalSize;
|
434
|
+
ULONG ListOffset;
|
435
|
+
ULONG ListSize;
|
436
|
+
ULONG BitmapOffset;
|
437
|
+
ULONG BitmapSize;
|
438
|
+
ULONG DataOffset;
|
439
|
+
ULONG DataSize;
|
440
|
+
ULONG AttributeFlags;
|
441
|
+
ULONG AttributeSize;
|
442
|
+
|
443
|
+
DECLSPEC_ALIGN(128) ALPC_COMPLETION_LIST_STATE State;
|
444
|
+
ULONG LastMessageId;
|
445
|
+
ULONG LastCallbackId;
|
446
|
+
DECLSPEC_ALIGN(128) ULONG PostCount;
|
447
|
+
DECLSPEC_ALIGN(128) ULONG ReturnCount;
|
448
|
+
DECLSPEC_ALIGN(128) ULONG LogSequenceNumber;
|
449
|
+
DECLSPEC_ALIGN(128) RTL_SRWLOCK UserLock;
|
450
|
+
|
451
|
+
ULONG64 EndMagic;
|
452
|
+
} ALPC_COMPLETION_LIST_HEADER, *PALPC_COMPLETION_LIST_HEADER;
|
453
|
+
|
454
|
+
// private
|
455
|
+
typedef struct _ALPC_CONTEXT_ATTR
|
456
|
+
{
|
457
|
+
PVOID PortContext;
|
458
|
+
PVOID MessageContext;
|
459
|
+
ULONG Sequence;
|
460
|
+
ULONG MessageId;
|
461
|
+
ULONG CallbackId;
|
462
|
+
} ALPC_CONTEXT_ATTR, *PALPC_CONTEXT_ATTR;
|
463
|
+
|
464
|
+
// begin_rev
|
465
|
+
#define ALPC_HANDLEFLG_DUPLICATE_SAME_ACCESS 0x10000
|
466
|
+
#define ALPC_HANDLEFLG_DUPLICATE_SAME_ATTRIBUTES 0x20000
|
467
|
+
#define ALPC_HANDLEFLG_DUPLICATE_INHERIT 0x80000
|
468
|
+
// end_rev
|
469
|
+
|
470
|
+
// private
|
471
|
+
typedef struct _ALPC_HANDLE_ATTR32
|
472
|
+
{
|
473
|
+
ULONG Flags;
|
474
|
+
ULONG Reserved0;
|
475
|
+
ULONG SameAccess;
|
476
|
+
ULONG SameAttributes;
|
477
|
+
ULONG Indirect;
|
478
|
+
ULONG Inherit;
|
479
|
+
ULONG Reserved1;
|
480
|
+
ULONG Handle;
|
481
|
+
ULONG ObjectType; // ObjectTypeCode, not ObjectTypeIndex
|
482
|
+
ULONG DesiredAccess;
|
483
|
+
ULONG GrantedAccess;
|
484
|
+
} ALPC_HANDLE_ATTR32, *PALPC_HANDLE_ATTR32;
|
485
|
+
|
486
|
+
// private
|
487
|
+
typedef struct _ALPC_HANDLE_ATTR
|
488
|
+
{
|
489
|
+
ULONG Flags;
|
490
|
+
ULONG Reserved0;
|
491
|
+
ULONG SameAccess;
|
492
|
+
ULONG SameAttributes;
|
493
|
+
ULONG Indirect;
|
494
|
+
ULONG Inherit;
|
495
|
+
ULONG Reserved1;
|
496
|
+
HANDLE Handle;
|
497
|
+
PALPC_HANDLE_ATTR32 HandleAttrArray;
|
498
|
+
ULONG ObjectType; // ObjectTypeCode, not ObjectTypeIndex
|
499
|
+
ULONG HandleCount;
|
500
|
+
ACCESS_MASK DesiredAccess;
|
501
|
+
ACCESS_MASK GrantedAccess;
|
502
|
+
} ALPC_HANDLE_ATTR, *PALPC_HANDLE_ATTR;
|
503
|
+
|
504
|
+
#define ALPC_SECFLG_CREATE_HANDLE 0x20000 // dbg
|
505
|
+
#define ALPC_SECFLG_NOSECTIONHANDLE 0x40000
|
506
|
+
// private
|
507
|
+
typedef struct _ALPC_SECURITY_ATTR
|
508
|
+
{
|
509
|
+
ULONG Flags;
|
510
|
+
PSECURITY_QUALITY_OF_SERVICE QoS;
|
511
|
+
ALPC_HANDLE ContextHandle; // dbg
|
512
|
+
} ALPC_SECURITY_ATTR, *PALPC_SECURITY_ATTR;
|
513
|
+
|
514
|
+
// begin_rev
|
515
|
+
#define ALPC_VIEWFLG_NOT_SECURE 0x40000
|
516
|
+
// end_rev
|
517
|
+
|
518
|
+
// private
|
519
|
+
typedef struct _ALPC_DATA_VIEW_ATTR
|
520
|
+
{
|
521
|
+
ULONG Flags;
|
522
|
+
ALPC_HANDLE SectionHandle;
|
523
|
+
PVOID ViewBase; // must be zero on input
|
524
|
+
SIZE_T ViewSize;
|
525
|
+
} ALPC_DATA_VIEW_ATTR, *PALPC_DATA_VIEW_ATTR;
|
526
|
+
|
527
|
+
// private
|
528
|
+
typedef enum _ALPC_PORT_INFORMATION_CLASS
|
529
|
+
{
|
530
|
+
AlpcBasicInformation, // q: out ALPC_BASIC_INFORMATION
|
531
|
+
AlpcPortInformation, // s: in ALPC_PORT_ATTRIBUTES
|
532
|
+
AlpcAssociateCompletionPortInformation, // s: in ALPC_PORT_ASSOCIATE_COMPLETION_PORT
|
533
|
+
AlpcConnectedSIDInformation, // q: in SID
|
534
|
+
AlpcServerInformation, // q: inout ALPC_SERVER_INFORMATION
|
535
|
+
AlpcMessageZoneInformation, // s: in ALPC_PORT_MESSAGE_ZONE_INFORMATION
|
536
|
+
AlpcRegisterCompletionListInformation, // s: in ALPC_PORT_COMPLETION_LIST_INFORMATION
|
537
|
+
AlpcUnregisterCompletionListInformation, // s: VOID
|
538
|
+
AlpcAdjustCompletionListConcurrencyCountInformation, // s: in ULONG
|
539
|
+
AlpcRegisterCallbackInformation, // kernel-mode only
|
540
|
+
AlpcCompletionListRundownInformation, // s: VOID
|
541
|
+
AlpcWaitForPortReferences
|
542
|
+
} ALPC_PORT_INFORMATION_CLASS;
|
543
|
+
|
544
|
+
// private
|
545
|
+
typedef struct _ALPC_BASIC_INFORMATION
|
546
|
+
{
|
547
|
+
ULONG Flags;
|
548
|
+
ULONG SequenceNo;
|
549
|
+
PVOID PortContext;
|
550
|
+
} ALPC_BASIC_INFORMATION, *PALPC_BASIC_INFORMATION;
|
551
|
+
|
552
|
+
// private
|
553
|
+
typedef struct _ALPC_PORT_ASSOCIATE_COMPLETION_PORT
|
554
|
+
{
|
555
|
+
PVOID CompletionKey;
|
556
|
+
HANDLE CompletionPort;
|
557
|
+
} ALPC_PORT_ASSOCIATE_COMPLETION_PORT, *PALPC_PORT_ASSOCIATE_COMPLETION_PORT;
|
558
|
+
|
559
|
+
// private
|
560
|
+
typedef struct _ALPC_SERVER_INFORMATION
|
561
|
+
{
|
562
|
+
union
|
563
|
+
{
|
564
|
+
struct
|
565
|
+
{
|
566
|
+
HANDLE ThreadHandle;
|
567
|
+
} In;
|
568
|
+
struct
|
569
|
+
{
|
570
|
+
BOOLEAN ThreadBlocked;
|
571
|
+
HANDLE ConnectedProcessId;
|
572
|
+
UNICODE_STRING ConnectionPortName;
|
573
|
+
} Out;
|
574
|
+
};
|
575
|
+
} ALPC_SERVER_INFORMATION, *PALPC_SERVER_INFORMATION;
|
576
|
+
|
577
|
+
// private
|
578
|
+
typedef struct _ALPC_PORT_MESSAGE_ZONE_INFORMATION
|
579
|
+
{
|
580
|
+
PVOID Buffer;
|
581
|
+
ULONG Size;
|
582
|
+
} ALPC_PORT_MESSAGE_ZONE_INFORMATION, *PALPC_PORT_MESSAGE_ZONE_INFORMATION;
|
583
|
+
|
584
|
+
// private
|
585
|
+
typedef struct _ALPC_PORT_COMPLETION_LIST_INFORMATION
|
586
|
+
{
|
587
|
+
PVOID Buffer; // PALPC_COMPLETION_LIST_HEADER
|
588
|
+
ULONG Size;
|
589
|
+
ULONG ConcurrencyCount;
|
590
|
+
ULONG AttributeFlags;
|
591
|
+
} ALPC_PORT_COMPLETION_LIST_INFORMATION, *PALPC_PORT_COMPLETION_LIST_INFORMATION;
|
592
|
+
|
593
|
+
// private
|
594
|
+
typedef enum _ALPC_MESSAGE_INFORMATION_CLASS
|
595
|
+
{
|
596
|
+
AlpcMessageSidInformation, // q: out SID
|
597
|
+
AlpcMessageTokenModifiedIdInformation, // q: out LUID
|
598
|
+
AlpcMessageDirectStatusInformation,
|
599
|
+
AlpcMessageHandleInformation, // ALPC_MESSAGE_HANDLE_INFORMATION
|
600
|
+
MaxAlpcMessageInfoClass
|
601
|
+
} ALPC_MESSAGE_INFORMATION_CLASS, *PALPC_MESSAGE_INFORMATION_CLASS;
|
602
|
+
|
603
|
+
typedef struct _ALPC_MESSAGE_HANDLE_INFORMATION
|
604
|
+
{
|
605
|
+
ULONG Index;
|
606
|
+
ULONG Flags;
|
607
|
+
ULONG Handle;
|
608
|
+
ULONG ObjectType;
|
609
|
+
ACCESS_MASK GrantedAccess;
|
610
|
+
} ALPC_MESSAGE_HANDLE_INFORMATION, *PALPC_MESSAGE_HANDLE_INFORMATION;
|
611
|
+
|
612
|
+
// begin_private
|
613
|
+
|
614
|
+
#if (NT_VERSION >= NT_VISTA)
|
615
|
+
|
616
|
+
// System calls
|
617
|
+
|
618
|
+
NTSYSCALLAPI
|
619
|
+
NTSTATUS
|
620
|
+
NTAPI
|
621
|
+
NtAlpcCreatePort(
|
622
|
+
_Out_ PHANDLE PortHandle,
|
623
|
+
_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
|
624
|
+
_In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes
|
625
|
+
);
|
626
|
+
|
627
|
+
NTSYSCALLAPI
|
628
|
+
NTSTATUS
|
629
|
+
NTAPI
|
630
|
+
NtAlpcDisconnectPort(
|
631
|
+
_In_ HANDLE PortHandle,
|
632
|
+
_In_ ULONG Flags
|
633
|
+
);
|
634
|
+
|
635
|
+
NTSYSCALLAPI
|
636
|
+
NTSTATUS
|
637
|
+
NTAPI
|
638
|
+
NtAlpcQueryInformation(
|
639
|
+
_In_opt_ HANDLE PortHandle,
|
640
|
+
_In_ ALPC_PORT_INFORMATION_CLASS PortInformationClass,
|
641
|
+
PVOID PortInformation,
|
642
|
+
_In_ ULONG Length,
|
643
|
+
_Out_opt_ PULONG ReturnLength
|
644
|
+
);
|
645
|
+
|
646
|
+
NTSYSCALLAPI
|
647
|
+
NTSTATUS
|
648
|
+
NTAPI
|
649
|
+
NtAlpcSetInformation(
|
650
|
+
_In_ HANDLE PortHandle,
|
651
|
+
_In_ ALPC_PORT_INFORMATION_CLASS PortInformationClass,
|
652
|
+
PVOID PortInformation,
|
653
|
+
_In_ ULONG Length
|
654
|
+
);
|
655
|
+
|
656
|
+
NTSYSCALLAPI
|
657
|
+
NTSTATUS
|
658
|
+
NTAPI
|
659
|
+
NtAlpcCreatePortSection(
|
660
|
+
_In_ HANDLE PortHandle,
|
661
|
+
_In_ ULONG Flags,
|
662
|
+
_In_opt_ HANDLE SectionHandle,
|
663
|
+
_In_ SIZE_T SectionSize,
|
664
|
+
_Out_ PALPC_HANDLE AlpcSectionHandle,
|
665
|
+
_Out_ PSIZE_T ActualSectionSize
|
666
|
+
);
|
667
|
+
|
668
|
+
NTSYSCALLAPI
|
669
|
+
NTSTATUS
|
670
|
+
NTAPI
|
671
|
+
NtAlpcDeletePortSection(
|
672
|
+
_In_ HANDLE PortHandle,
|
673
|
+
_Reserved_ ULONG Flags,
|
674
|
+
_In_ ALPC_HANDLE SectionHandle
|
675
|
+
);
|
676
|
+
|
677
|
+
NTSYSCALLAPI
|
678
|
+
NTSTATUS
|
679
|
+
NTAPI
|
680
|
+
NtAlpcCreateResourceReserve(
|
681
|
+
_In_ HANDLE PortHandle,
|
682
|
+
_Reserved_ ULONG Flags,
|
683
|
+
_In_ SIZE_T MessageSize,
|
684
|
+
_Out_ PALPC_HANDLE ResourceId
|
685
|
+
);
|
686
|
+
|
687
|
+
NTSYSCALLAPI
|
688
|
+
NTSTATUS
|
689
|
+
NTAPI
|
690
|
+
NtAlpcDeleteResourceReserve(
|
691
|
+
_In_ HANDLE PortHandle,
|
692
|
+
_Reserved_ ULONG Flags,
|
693
|
+
_In_ ALPC_HANDLE ResourceId
|
694
|
+
);
|
695
|
+
|
696
|
+
NTSYSCALLAPI
|
697
|
+
NTSTATUS
|
698
|
+
NTAPI
|
699
|
+
NtAlpcCreateSectionView(
|
700
|
+
_In_ HANDLE PortHandle,
|
701
|
+
_Reserved_ ULONG Flags,
|
702
|
+
_Inout_ PALPC_DATA_VIEW_ATTR ViewAttributes
|
703
|
+
);
|
704
|
+
|
705
|
+
NTSYSCALLAPI
|
706
|
+
NTSTATUS
|
707
|
+
NTAPI
|
708
|
+
NtAlpcDeleteSectionView(
|
709
|
+
_In_ HANDLE PortHandle,
|
710
|
+
_Reserved_ ULONG Flags,
|
711
|
+
_In_ PVOID ViewBase
|
712
|
+
);
|
713
|
+
|
714
|
+
NTSYSCALLAPI
|
715
|
+
NTSTATUS
|
716
|
+
NTAPI
|
717
|
+
NtAlpcCreateSecurityContext(
|
718
|
+
_In_ HANDLE PortHandle,
|
719
|
+
_Reserved_ ULONG Flags,
|
720
|
+
_Inout_ PALPC_SECURITY_ATTR SecurityAttribute
|
721
|
+
);
|
722
|
+
|
723
|
+
NTSYSCALLAPI
|
724
|
+
NTSTATUS
|
725
|
+
NTAPI
|
726
|
+
NtAlpcDeleteSecurityContext(
|
727
|
+
_In_ HANDLE PortHandle,
|
728
|
+
_Reserved_ ULONG Flags,
|
729
|
+
_In_ ALPC_HANDLE ContextHandle
|
730
|
+
);
|
731
|
+
|
732
|
+
NTSYSCALLAPI
|
733
|
+
NTSTATUS
|
734
|
+
NTAPI
|
735
|
+
NtAlpcRevokeSecurityContext(
|
736
|
+
_In_ HANDLE PortHandle,
|
737
|
+
_Reserved_ ULONG Flags,
|
738
|
+
_In_ ALPC_HANDLE ContextHandle
|
739
|
+
);
|
740
|
+
|
741
|
+
NTSYSCALLAPI
|
742
|
+
NTSTATUS
|
743
|
+
NTAPI
|
744
|
+
NtAlpcQueryInformationMessage(
|
745
|
+
_In_ HANDLE PortHandle,
|
746
|
+
_In_ PPORT_MESSAGE PortMessage,
|
747
|
+
_In_ ALPC_MESSAGE_INFORMATION_CLASS MessageInformationClass,
|
748
|
+
_Inout_ PVOID MessageInformation,
|
749
|
+
_In_ ULONG Length,
|
750
|
+
_Out_opt_ PULONG ReturnLength
|
751
|
+
);
|
752
|
+
|
753
|
+
#define ALPC_MSGFLG_REPLY_MESSAGE 0x1
|
754
|
+
#define ALPC_MSGFLG_LPC_MODE 0x2 // ?
|
755
|
+
#define ALPC_MSGFLG_RELEASE_MESSAGE 0x10000 // dbg
|
756
|
+
#define ALPC_MSGFLG_SYNC_REQUEST 0x20000 // dbg
|
757
|
+
#define ALPC_MSGFLG_WAIT_USER_MODE 0x100000
|
758
|
+
#define ALPC_MSGFLG_WAIT_ALERTABLE 0x200000
|
759
|
+
#define ALPC_MSGFLG_WOW64_CALL 0x80000000 // dbg
|
760
|
+
|
761
|
+
NTSYSCALLAPI
|
762
|
+
NTSTATUS
|
763
|
+
NTAPI
|
764
|
+
NtAlpcConnectPort(
|
765
|
+
_Out_ PHANDLE PortHandle,
|
766
|
+
_In_ PUNICODE_STRING PortName,
|
767
|
+
_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
|
768
|
+
_In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes,
|
769
|
+
_In_ ULONG Flags,
|
770
|
+
_In_opt_ PSID RequiredServerSid,
|
771
|
+
PPORT_MESSAGE ConnectionMessage,
|
772
|
+
_Inout_opt_ PULONG BufferLength,
|
773
|
+
_Inout_opt_ PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes,
|
774
|
+
_Inout_opt_ PALPC_MESSAGE_ATTRIBUTES InMessageAttributes,
|
775
|
+
_In_opt_ PLARGE_INTEGER Timeout
|
776
|
+
);
|
777
|
+
|
778
|
+
#if (NT_VERSION >= NT_WIN8)
|
779
|
+
NTSYSCALLAPI
|
780
|
+
NTSTATUS
|
781
|
+
NTAPI
|
782
|
+
NtAlpcConnectPortEx(
|
783
|
+
_Out_ PHANDLE PortHandle,
|
784
|
+
_In_ POBJECT_ATTRIBUTES ConnectionPortObjectAttributes,
|
785
|
+
_In_opt_ POBJECT_ATTRIBUTES ClientPortObjectAttributes,
|
786
|
+
_In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes,
|
787
|
+
_In_ ULONG Flags,
|
788
|
+
_In_opt_ PSECURITY_DESCRIPTOR ServerSecurityRequirements,
|
789
|
+
PPORT_MESSAGE ConnectionMessage,
|
790
|
+
_Inout_opt_ PSIZE_T BufferLength,
|
791
|
+
_Inout_opt_ PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes,
|
792
|
+
_Inout_opt_ PALPC_MESSAGE_ATTRIBUTES InMessageAttributes,
|
793
|
+
_In_opt_ PLARGE_INTEGER Timeout
|
794
|
+
);
|
795
|
+
#endif
|
796
|
+
|
797
|
+
NTSYSCALLAPI
|
798
|
+
NTSTATUS
|
799
|
+
NTAPI
|
800
|
+
NtAlpcAcceptConnectPort(
|
801
|
+
_Out_ PHANDLE PortHandle,
|
802
|
+
_In_ HANDLE ConnectionPortHandle,
|
803
|
+
_In_ ULONG Flags,
|
804
|
+
_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
|
805
|
+
_In_opt_ PALPC_PORT_ATTRIBUTES PortAttributes,
|
806
|
+
_In_opt_ PVOID PortContext,
|
807
|
+
PPORT_MESSAGE ConnectionRequest,
|
808
|
+
_Inout_opt_ PALPC_MESSAGE_ATTRIBUTES ConnectionMessageAttributes,
|
809
|
+
_In_ BOOLEAN AcceptConnection
|
810
|
+
);
|
811
|
+
|
812
|
+
NTSYSCALLAPI
|
813
|
+
NTSTATUS
|
814
|
+
NTAPI
|
815
|
+
NtAlpcSendWaitReceivePort(
|
816
|
+
_In_ HANDLE PortHandle,
|
817
|
+
_In_ ULONG Flags,
|
818
|
+
PPORT_MESSAGE SendMessage,
|
819
|
+
_Inout_opt_ PALPC_MESSAGE_ATTRIBUTES SendMessageAttributes,
|
820
|
+
PPORT_MESSAGE ReceiveMessage,
|
821
|
+
_Inout_opt_ PSIZE_T BufferLength,
|
822
|
+
_Inout_opt_ PALPC_MESSAGE_ATTRIBUTES ReceiveMessageAttributes,
|
823
|
+
_In_opt_ PLARGE_INTEGER Timeout
|
824
|
+
);
|
825
|
+
|
826
|
+
#define ALPC_CANCELFLG_TRY_CANCEL 0x1 // dbg
|
827
|
+
#define ALPC_CANCELFLG_NO_CONTEXT_CHECK 0x8
|
828
|
+
#define ALPC_CANCELFLGP_FLUSH 0x10000 // dbg
|
829
|
+
|
830
|
+
NTSYSCALLAPI
|
831
|
+
NTSTATUS
|
832
|
+
NTAPI
|
833
|
+
NtAlpcCancelMessage(
|
834
|
+
_In_ HANDLE PortHandle,
|
835
|
+
_In_ ULONG Flags,
|
836
|
+
_In_ PALPC_CONTEXT_ATTR MessageContext
|
837
|
+
);
|
838
|
+
|
839
|
+
NTSYSCALLAPI
|
840
|
+
NTSTATUS
|
841
|
+
NTAPI
|
842
|
+
NtAlpcImpersonateClientOfPort(
|
843
|
+
_In_ HANDLE PortHandle,
|
844
|
+
_In_ PPORT_MESSAGE Message,
|
845
|
+
_In_ PVOID Flags
|
846
|
+
);
|
847
|
+
|
848
|
+
#if (NT_VERSION >= NT_THRESHOLD)
|
849
|
+
NTSYSCALLAPI
|
850
|
+
NTSTATUS
|
851
|
+
NTAPI
|
852
|
+
NtAlpcImpersonateClientContainerOfPort(
|
853
|
+
_In_ HANDLE PortHandle,
|
854
|
+
_In_ PPORT_MESSAGE Message,
|
855
|
+
_In_ ULONG Flags
|
856
|
+
);
|
857
|
+
#endif
|
858
|
+
|
859
|
+
NTSYSCALLAPI
|
860
|
+
NTSTATUS
|
861
|
+
NTAPI
|
862
|
+
NtAlpcOpenSenderProcess(
|
863
|
+
_Out_ PHANDLE ProcessHandle,
|
864
|
+
_In_ HANDLE PortHandle,
|
865
|
+
_In_ PPORT_MESSAGE PortMessage,
|
866
|
+
_In_ ULONG Flags,
|
867
|
+
_In_ ACCESS_MASK DesiredAccess,
|
868
|
+
_In_ POBJECT_ATTRIBUTES ObjectAttributes
|
869
|
+
);
|
870
|
+
|
871
|
+
NTSYSCALLAPI
|
872
|
+
NTSTATUS
|
873
|
+
NTAPI
|
874
|
+
NtAlpcOpenSenderThread(
|
875
|
+
_Out_ PHANDLE ThreadHandle,
|
876
|
+
_In_ HANDLE PortHandle,
|
877
|
+
_In_ PPORT_MESSAGE PortMessage,
|
878
|
+
_In_ ULONG Flags,
|
879
|
+
_In_ ACCESS_MASK DesiredAccess,
|
880
|
+
_In_ POBJECT_ATTRIBUTES ObjectAttributes
|
881
|
+
);
|
882
|
+
|
883
|
+
// Support functions
|
884
|
+
|
885
|
+
NTSYSAPI
|
886
|
+
ULONG
|
887
|
+
NTAPI
|
888
|
+
AlpcMaxAllowedMessageLength(
|
889
|
+
VOID
|
890
|
+
);
|
891
|
+
|
892
|
+
NTSYSAPI
|
893
|
+
ULONG
|
894
|
+
NTAPI
|
895
|
+
AlpcGetHeaderSize(
|
896
|
+
_In_ ULONG Flags
|
897
|
+
);
|
898
|
+
|
899
|
+
#define ALPC_ATTRFLG_ALLOCATEDATTR 0x20000000
|
900
|
+
#define ALPC_ATTRFLG_VALIDATTR 0x40000000
|
901
|
+
#define ALPC_ATTRFLG_KEEPRUNNINGATTR 0x60000000
|
902
|
+
|
903
|
+
NTSYSAPI
|
904
|
+
NTSTATUS
|
905
|
+
NTAPI
|
906
|
+
AlpcInitializeMessageAttribute(
|
907
|
+
_In_ ULONG AttributeFlags,
|
908
|
+
_Out_opt_ PALPC_MESSAGE_ATTRIBUTES Buffer,
|
909
|
+
_In_ ULONG BufferSize,
|
910
|
+
_Out_ PULONG RequiredBufferSize
|
911
|
+
);
|
912
|
+
|
913
|
+
NTSYSAPI
|
914
|
+
PVOID
|
915
|
+
NTAPI
|
916
|
+
AlpcGetMessageAttribute(
|
917
|
+
_In_ PALPC_MESSAGE_ATTRIBUTES Buffer,
|
918
|
+
_In_ ULONG AttributeFlag
|
919
|
+
);
|
920
|
+
|
921
|
+
NTSYSAPI
|
922
|
+
NTSTATUS
|
923
|
+
NTAPI
|
924
|
+
AlpcRegisterCompletionList(
|
925
|
+
_In_ HANDLE PortHandle,
|
926
|
+
_Out_ PALPC_COMPLETION_LIST_HEADER Buffer,
|
927
|
+
_In_ ULONG Size,
|
928
|
+
_In_ ULONG ConcurrencyCount,
|
929
|
+
_In_ ULONG AttributeFlags
|
930
|
+
);
|
931
|
+
|
932
|
+
NTSYSAPI
|
933
|
+
NTSTATUS
|
934
|
+
NTAPI
|
935
|
+
AlpcUnregisterCompletionList(
|
936
|
+
_In_ HANDLE PortHandle
|
937
|
+
);
|
938
|
+
|
939
|
+
#if (NT_VERSION >= NT_WIN7)
|
940
|
+
// rev
|
941
|
+
NTSYSAPI
|
942
|
+
NTSTATUS
|
943
|
+
NTAPI
|
944
|
+
AlpcRundownCompletionList(
|
945
|
+
_In_ HANDLE PortHandle
|
946
|
+
);
|
947
|
+
#endif
|
948
|
+
|
949
|
+
NTSYSAPI
|
950
|
+
NTSTATUS
|
951
|
+
NTAPI
|
952
|
+
AlpcAdjustCompletionListConcurrencyCount(
|
953
|
+
_In_ HANDLE PortHandle,
|
954
|
+
_In_ ULONG ConcurrencyCount
|
955
|
+
);
|
956
|
+
|
957
|
+
NTSYSAPI
|
958
|
+
BOOLEAN
|
959
|
+
NTAPI
|
960
|
+
AlpcRegisterCompletionListWorkerThread(
|
961
|
+
_Inout_ PVOID CompletionList
|
962
|
+
);
|
963
|
+
|
964
|
+
NTSYSAPI
|
965
|
+
BOOLEAN
|
966
|
+
NTAPI
|
967
|
+
AlpcUnregisterCompletionListWorkerThread(
|
968
|
+
_Inout_ PVOID CompletionList
|
969
|
+
);
|
970
|
+
|
971
|
+
NTSYSAPI
|
972
|
+
VOID
|
973
|
+
NTAPI
|
974
|
+
AlpcGetCompletionListLastMessageInformation(
|
975
|
+
_In_ PVOID CompletionList,
|
976
|
+
_Out_ PULONG LastMessageId,
|
977
|
+
_Out_ PULONG LastCallbackId
|
978
|
+
);
|
979
|
+
|
980
|
+
NTSYSAPI
|
981
|
+
ULONG
|
982
|
+
NTAPI
|
983
|
+
AlpcGetOutstandingCompletionListMessageCount(
|
984
|
+
_In_ PVOID CompletionList
|
985
|
+
);
|
986
|
+
|
987
|
+
NTSYSAPI
|
988
|
+
PPORT_MESSAGE
|
989
|
+
NTAPI
|
990
|
+
AlpcGetMessageFromCompletionList(
|
991
|
+
_In_ PVOID CompletionList,
|
992
|
+
_Out_opt_ PALPC_MESSAGE_ATTRIBUTES *MessageAttributes
|
993
|
+
);
|
994
|
+
|
995
|
+
NTSYSAPI
|
996
|
+
VOID
|
997
|
+
NTAPI
|
998
|
+
AlpcFreeCompletionListMessage(
|
999
|
+
_Inout_ PVOID CompletionList,
|
1000
|
+
_In_ PPORT_MESSAGE Message
|
1001
|
+
);
|
1002
|
+
|
1003
|
+
NTSYSAPI
|
1004
|
+
PALPC_MESSAGE_ATTRIBUTES
|
1005
|
+
NTAPI
|
1006
|
+
AlpcGetCompletionListMessageAttributes(
|
1007
|
+
_In_ PVOID CompletionList,
|
1008
|
+
_In_ PPORT_MESSAGE Message
|
1009
|
+
);
|
1010
|
+
#endif
|
1011
|
+
|
1012
|
+
// end_private
|
1013
|
+
|
1014
|
+
#endif
|