turborex 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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,167 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TurboRex
|
4
|
+
module MSRPC
|
5
|
+
module NDRType
|
6
|
+
# https://github.com/wine-mirror/wine/tree/master/tools/widl
|
7
|
+
# https://docs.microsoft.com/en-us/windows/win32/midl/midl-data-types
|
8
|
+
# https://github.com/wine-mirror/wine/blob/master/include/ndrtypes.h
|
9
|
+
|
10
|
+
# FC Base Type
|
11
|
+
FC_ZERO = 0x0
|
12
|
+
FC_BYTE = 0x1
|
13
|
+
FC_CHAR = 0x2
|
14
|
+
FC_SMALL = 0x3
|
15
|
+
FC_USMALL = 0x4
|
16
|
+
FC_WCHAR = 0x5
|
17
|
+
FC_SHORT = 0x6
|
18
|
+
FC_USHORT = 0x7
|
19
|
+
FC_LONG = 0x8
|
20
|
+
FC_ULONG = 0x9
|
21
|
+
FC_FLOAT = 0xA
|
22
|
+
FC_HYPER = 0xB
|
23
|
+
FC_DOUBLE = 0xC
|
24
|
+
FC_ENUM16 = 0xD
|
25
|
+
FC_ENUM32 = 0xE
|
26
|
+
FC_IGNORE = 0xF
|
27
|
+
FC_ERROR_STATUS_T = 0x10
|
28
|
+
|
29
|
+
FC_RP = 0x11
|
30
|
+
FC_UP = 0x12
|
31
|
+
FC_OP = 0x13
|
32
|
+
FC_FP = 0x14
|
33
|
+
FC_STRUCT = 0x15
|
34
|
+
FC_PSTRUCT = 0x16
|
35
|
+
FC_CSTRUCT = 0x17
|
36
|
+
FC_CPSTRUCT = 0x18
|
37
|
+
FC_CVSTRUCT = 0x19
|
38
|
+
FC_BOGUS_STRUCT = 0x1A
|
39
|
+
FC_CARRAY = 0x1B
|
40
|
+
FC_CVARRAY = 0x1C
|
41
|
+
FC_SMFARRAY = 0x1D
|
42
|
+
FC_LGFARRAY = 0x1E
|
43
|
+
FC_SMVARRAY = 0x1F
|
44
|
+
FC_LGVARRAY = 0x20
|
45
|
+
FC_BOGUS_ARRAY = 0x21
|
46
|
+
FC_C_CSTRING = 0x22
|
47
|
+
FC_C_BSTRING = 0x23
|
48
|
+
FC_C_SSTRING = 0x24
|
49
|
+
FC_C_WSTRING = 0x25
|
50
|
+
FC_CSTRING = 0x26
|
51
|
+
FC_BSTRING = 0x27
|
52
|
+
FC_SSTRING = 0x28
|
53
|
+
FC_WSTRING = 0x29
|
54
|
+
FC_ENCAPSULATED_UNION = 0x2A
|
55
|
+
FC_NON_ENCAPSULATED_UNION = 0x2B
|
56
|
+
FC_BYTE_COUNT_POINTER = 0x2C
|
57
|
+
FC_TRANSMIT_AS = 0x2D
|
58
|
+
FC_REPRESENT_AS = 0x2E
|
59
|
+
FC_IP = 0x2F
|
60
|
+
FC_EXPLICIT_HANDLE = 0x00
|
61
|
+
FC_BIND_CONTEXT = 0x30
|
62
|
+
FC_BIND_GENERIC = 0x31
|
63
|
+
FC_BIND_PRIMITIVE = 0x32
|
64
|
+
FC_AUTO_HANDLE = 0x33
|
65
|
+
FC_CALLBACK_HANDLE = 0x34
|
66
|
+
FC_UNUSED1 = 0x35
|
67
|
+
FC_POINTER = 0x36
|
68
|
+
FC_ALIGNM2 = 0x37
|
69
|
+
FC_ALIGNM4 = 0x38
|
70
|
+
FC_ALIGNM8 = 0x39
|
71
|
+
FC_UNUSED2 = 0x3A
|
72
|
+
FC_UNUSED3 = 0x3B
|
73
|
+
FC_UNUSED4 = 0x3C
|
74
|
+
FC_STRUCTPAD1 = 0x3D
|
75
|
+
FC_STRUCTPAD2 = 0x3E
|
76
|
+
FC_STRUCTPAD3 = 0x3F
|
77
|
+
FC_STRUCTPAD4 = 0x40
|
78
|
+
FC_STRUCTPAD5 = 0x41
|
79
|
+
FC_STRUCTPAD6 = 0x42
|
80
|
+
FC_STRUCTPAD7 = 0x43
|
81
|
+
FC_STRING_SIZED = 0x44
|
82
|
+
FC_UNUSED5 = 0x45
|
83
|
+
FC_NO_REPEAT = 0x46
|
84
|
+
FC_FIXED_REPEAT = 0x47
|
85
|
+
FC_VARIABLE_REPEAT = 0x48
|
86
|
+
FC_FIXED_OFFSET = 0x49
|
87
|
+
FC_VARIABLE_OFFSET = 0x4A
|
88
|
+
FC_PP = 0x4B
|
89
|
+
FC_EMBEDDED_COMPLEX = 0x4C
|
90
|
+
FC_IN_PARAM = 0x4D
|
91
|
+
FC_IN_PARAM_BASETYPE = 0x4E
|
92
|
+
FC_IN_PARAM_NO_FREE_INST = 0x4F
|
93
|
+
FC_IN_OUT_PARAM = 0x50
|
94
|
+
FC_OUT_PARAM = 0x51
|
95
|
+
FC_RETURN_PARAM = 0x52
|
96
|
+
FC_RETURN_PARAM_BASETYPE = 0x53
|
97
|
+
FC_DEREFERENCE = 0x54
|
98
|
+
FC_DIV_2 = 0x55
|
99
|
+
FC_MULT_2 = 0x56
|
100
|
+
FC_ADD_1 = 0x57
|
101
|
+
FC_SUB_1 = 0x58
|
102
|
+
FC_CALLBACK = 0x59
|
103
|
+
FC_CONSTANT_IID = 0x5A
|
104
|
+
FC_END = 0x5B
|
105
|
+
FC_PAD = 0x5C
|
106
|
+
FC_EXPR = 0x5D
|
107
|
+
FC_SPLIT_DEREFERENCE = 0x74
|
108
|
+
FC_SPLIT_DIV_2 = 0x75
|
109
|
+
FC_SPLIT_MULT_2 = 0x76
|
110
|
+
FC_SPLIT_ADD_1 = 0x77
|
111
|
+
FC_SPLIT_SUB_1 = 0x78
|
112
|
+
FC_SPLIT_CALLBACK = 0x79
|
113
|
+
FC_HARD_STRUCT = 0xB1
|
114
|
+
FC_TRANSMIT_AS_PTR = 0xB2
|
115
|
+
FC_REPRESENT_AS_PTR = 0xB3
|
116
|
+
FC_USER_MARSHAL = 0xB4
|
117
|
+
FC_PIPE = 0xB5
|
118
|
+
FC_BLKHOLE = 0xB6
|
119
|
+
FC_RANGE = 0xB7
|
120
|
+
FC_INT3264 = 0xB8 # base type
|
121
|
+
FC_UINT3264 = 0xB9 # base type
|
122
|
+
FC_END_OF_UNIVERSE = 0xBA
|
123
|
+
|
124
|
+
# The Oi flags
|
125
|
+
Oi_FULL_PTR_USED = 0x01
|
126
|
+
Oi_RPCSS_ALLOC_USED = 0x02
|
127
|
+
Oi_OBJECT_PROC = 0x04
|
128
|
+
Oi_HAS_RPCFLAGS = 0x08
|
129
|
+
Oi_overloaded1 = 0x10
|
130
|
+
Oi_overloaded2 = 0x20
|
131
|
+
Oi_USE_NEW_INIT_ROUTINES = 0x40
|
132
|
+
Oi_Unused = 0x80
|
133
|
+
|
134
|
+
# Overloaded Oi flags
|
135
|
+
ENCODE_IS_USED = 0x10
|
136
|
+
DECODE_IS_USED = 0x20
|
137
|
+
Oi_IGNORE_OBJECT_EXCEPTION_HANDLING = 0x10
|
138
|
+
Oi_HAS_COMM_OR_FAULT = 0x20
|
139
|
+
Oi_OBJ_USE_V2_INTERPRETER = 0x20
|
140
|
+
|
141
|
+
# Interpreter opt flags
|
142
|
+
module InterpreterOptFlags
|
143
|
+
ServerMustSize = 0x01
|
144
|
+
ClientMustSize = 0x02
|
145
|
+
HasReturn = 0x04
|
146
|
+
HasPipes = 0x08
|
147
|
+
Unused = 0x10
|
148
|
+
HasAsyncUuid = 0x20
|
149
|
+
HasExtensions = 0x40
|
150
|
+
HasAsyncHandle = 0x80
|
151
|
+
end
|
152
|
+
|
153
|
+
module InterpreterOptFlags2
|
154
|
+
HasNewCorrDesc = 0x01
|
155
|
+
ClientCorrCheck = 0x02
|
156
|
+
ServerCorrCheck = 0x04
|
157
|
+
HasNotify = 0x08
|
158
|
+
HasNotify2 = 0x10
|
159
|
+
HasComplexReturn = 0x20
|
160
|
+
HasRangeOnConformance = 0x40
|
161
|
+
end
|
162
|
+
|
163
|
+
WIN2K_EXT_SIZE = 8
|
164
|
+
WIN2K_EXT64_SIZE = 10 # 12?
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,777 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TurboRex
|
4
|
+
module MSRPC
|
5
|
+
module RPCBase
|
6
|
+
extend TurboRex::CStruct
|
7
|
+
|
8
|
+
RPC_Struct_Mgr32 = define_structs do
|
9
|
+
struct GENERIC_BINDING_ROUTINE_PAIR {
|
10
|
+
PVOID pfnBind
|
11
|
+
PVOID pfnUnbind
|
12
|
+
}
|
13
|
+
|
14
|
+
struct GUID {
|
15
|
+
UINT data1
|
16
|
+
USHORT data2
|
17
|
+
USHORT data3
|
18
|
+
BYTE data4[8]
|
19
|
+
}
|
20
|
+
|
21
|
+
struct RPC_VERSION {
|
22
|
+
USHORT majorVersion
|
23
|
+
USHORT minorVersion
|
24
|
+
}
|
25
|
+
|
26
|
+
struct RPC_SYNTAX_IDENTIFIER {
|
27
|
+
GUID syntaxGUID
|
28
|
+
RPC_VERSION syntaxVersion
|
29
|
+
}
|
30
|
+
|
31
|
+
struct RPC_SERVER_INTERFACE {
|
32
|
+
UINT length
|
33
|
+
RPC_SYNTAX_IDENTIFIER interfaceId
|
34
|
+
RPC_SYNTAX_IDENTIFIER transferSyntax
|
35
|
+
PVOID dispatchTable
|
36
|
+
UINT rpcProtseqEndpointCount
|
37
|
+
PVOID rpcProtseqEndpoint
|
38
|
+
PVOID defaultManagerEpv
|
39
|
+
PVOID interpreterInfo
|
40
|
+
UINT flags
|
41
|
+
}
|
42
|
+
|
43
|
+
struct RPC_PROTSEQ_ENDPOINT {
|
44
|
+
PVOID rpcProtocolSequence
|
45
|
+
PVOID endpoint
|
46
|
+
}
|
47
|
+
|
48
|
+
struct RPC_DISPATCH_TABLE_T {
|
49
|
+
UINT dispatchTableCount
|
50
|
+
PVOID dispatchTable
|
51
|
+
ULONG_PTR_T reserved
|
52
|
+
}
|
53
|
+
|
54
|
+
struct MIDL_SERVER_INFO {
|
55
|
+
PVOID pStubDesc
|
56
|
+
PVOID dispatchTable
|
57
|
+
PVOID procString
|
58
|
+
PVOID fmtStringOffset
|
59
|
+
PVOID thunkTable
|
60
|
+
PVOID pTransferSyntax
|
61
|
+
PVOID nCount
|
62
|
+
PVOID pSyntaxInfo
|
63
|
+
}
|
64
|
+
|
65
|
+
struct MIDL_STUB_DESC {
|
66
|
+
PVOID rpcInterfaceInformation
|
67
|
+
PVOID pfnAllocate
|
68
|
+
PVOID pfnFree
|
69
|
+
PVOID implicit_handle_info
|
70
|
+
PVOID apfnNdrRundownRoutines
|
71
|
+
PVOID aGenericBindingRoutinePairs
|
72
|
+
PVOID apfnExprEval
|
73
|
+
PVOID aXmitQuintuple
|
74
|
+
PVOID pFormatTypes
|
75
|
+
INT fCheckBounds
|
76
|
+
ULONG version
|
77
|
+
PVOID pMallocFreeStruct
|
78
|
+
LONG midlVersion
|
79
|
+
PVOID commFaultOffsets
|
80
|
+
PVOID aUserMarshalQuadruple
|
81
|
+
PVOID notifyRoutineTable
|
82
|
+
ULONG_PTR mFlags
|
83
|
+
PVOID csRoutineTables
|
84
|
+
PVOID proxyServerInfo
|
85
|
+
PVOID pExprInfo
|
86
|
+
}
|
87
|
+
|
88
|
+
struct MIDL_STUBLESS_PROXY_INFO {
|
89
|
+
PVOID pStubDesc
|
90
|
+
PVOID procFormatString
|
91
|
+
PVOID formatStringOffset
|
92
|
+
PVOID pTransferSyntax
|
93
|
+
ULONG_PTR nCount
|
94
|
+
PVOID pSyntaxInfo
|
95
|
+
}
|
96
|
+
|
97
|
+
struct MIDL_SYNTAX_INFO {
|
98
|
+
RPC_SYNTAX_IDENTIFIER transferSyntax
|
99
|
+
PVOID dispatchTable
|
100
|
+
PVOID procString
|
101
|
+
PVOID fmtStringOffset
|
102
|
+
PVOID typeString
|
103
|
+
PVOID aUserMarshalQuadruple
|
104
|
+
PVOID pMethodProperties
|
105
|
+
ULONG_PTR pReserved2
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
RPC_Struct_Mgr64 = define_structs(arch: 'x64') do
|
110
|
+
struct GUID {
|
111
|
+
uint data1
|
112
|
+
ushort data2
|
113
|
+
ushort data3
|
114
|
+
BYTE data4[8]
|
115
|
+
}
|
116
|
+
|
117
|
+
struct RPC_VERSION {
|
118
|
+
ushort majorVersion
|
119
|
+
ushort minorVersion
|
120
|
+
}
|
121
|
+
|
122
|
+
struct RPC_SYNTAX_IDENTIFIER {
|
123
|
+
GUID syntaxGUID
|
124
|
+
RPC_VERSION syntaxVersion
|
125
|
+
}
|
126
|
+
|
127
|
+
struct RPC_SERVER_INTERFACE {
|
128
|
+
UINT length
|
129
|
+
RPC_SYNTAX_IDENTIFIER interfaceId
|
130
|
+
RPC_SYNTAX_IDENTIFIER transferSyntax
|
131
|
+
PVOID dispatchTable
|
132
|
+
UINT rpcProtseqEndpointCount
|
133
|
+
PVOID rpcProtseqEndpoint
|
134
|
+
PVOID defaultManagerEpv
|
135
|
+
PVOID interpreterInfo
|
136
|
+
UINT flags
|
137
|
+
}
|
138
|
+
|
139
|
+
struct RPC_PROTSEQ_ENDPOINT {
|
140
|
+
PVOID rpcProtocolSequence
|
141
|
+
PVOID endpoint
|
142
|
+
}
|
143
|
+
|
144
|
+
struct RPC_DISPATCH_TABLE_T {
|
145
|
+
UINT dispatchTableCount
|
146
|
+
PVOID dispatchTable
|
147
|
+
ULONG_PTR_T reserved
|
148
|
+
}
|
149
|
+
|
150
|
+
struct MIDL_STUB_DESC {
|
151
|
+
PVOID rpcInterfaceInformation
|
152
|
+
PVOID pfnAllocate
|
153
|
+
PVOID pfnFree
|
154
|
+
PVOID implicit_handle_info
|
155
|
+
PVOID apfnNdrRundownRoutines
|
156
|
+
PVOID aGenericBindingRoutinePairs
|
157
|
+
PVOID apfnExprEval
|
158
|
+
PVOID aXmitQuintuple
|
159
|
+
PVOID pFormatTypes
|
160
|
+
INT fCheckBounds
|
161
|
+
ULONG version
|
162
|
+
PVOID pMallocFreeStruct
|
163
|
+
LONG midlVersion
|
164
|
+
PVOID commFaultOffsets
|
165
|
+
PVOID aUserMarshalQuadruple
|
166
|
+
PVOID notifyRoutineTable
|
167
|
+
ULONG_PTR mFlags
|
168
|
+
PVOID csRoutineTables
|
169
|
+
PVOID proxyServerInfo
|
170
|
+
PVOID pExprInfo
|
171
|
+
}
|
172
|
+
|
173
|
+
struct MIDL_SERVER_INFO {
|
174
|
+
PVOID pStubDesc
|
175
|
+
PVOID dispatchTable
|
176
|
+
PVOID procString
|
177
|
+
PVOID fmtStringOffset
|
178
|
+
PVOID thunkTable
|
179
|
+
PVOID pTransferSyntax
|
180
|
+
PVOID nCount
|
181
|
+
PVOID pSyntaxInfo
|
182
|
+
}
|
183
|
+
|
184
|
+
struct MIDL_SYNTAX_INFO {
|
185
|
+
RPC_SYNTAX_IDENTIFIER transferSyntax
|
186
|
+
PVOID dispatchTable
|
187
|
+
PVOID procString
|
188
|
+
PVOID fmtStringOffset
|
189
|
+
PVOID typeString
|
190
|
+
PVOID aUserMarshalQuadruple
|
191
|
+
PVOID pMethodProperties
|
192
|
+
ULONG_PTR pReserved2
|
193
|
+
}
|
194
|
+
|
195
|
+
struct MIDL_STUBLESS_PROXY_INFO {
|
196
|
+
PVOID pStubDesc
|
197
|
+
PVOID procFormatString
|
198
|
+
PVOID formatStringOffset
|
199
|
+
PVOID pTransferSyntax
|
200
|
+
ULONG_PTR nCount
|
201
|
+
PVOID pSyntaxInfo
|
202
|
+
}
|
203
|
+
end
|
204
|
+
|
205
|
+
RPC_SERVER_INTERFACE = RPC_Struct_Mgr32['RPC_SERVER_INTERFACE']
|
206
|
+
RPC_SERVER_INTERFACE32 = RPC_Struct_Mgr32['RPC_SERVER_INTERFACE']
|
207
|
+
RPC_SERVER_INTERFACE64 = RPC_Struct_Mgr64['RPC_SERVER_INTERFACE']
|
208
|
+
RPC_PROTSEQ_ENDPOINT = RPC_Struct_Mgr32['RPC_PROTSEQ_ENDPOINT']
|
209
|
+
RPC_PROTSEQ_ENDPOINT32 = RPC_Struct_Mgr32['RPC_PROTSEQ_ENDPOINT']
|
210
|
+
RPC_PROTSEQ_ENDPOINT64 = RPC_Struct_Mgr64['RPC_PROTSEQ_ENDPOINT']
|
211
|
+
MIDL_SERVER_INFO = RPC_Struct_Mgr32['MIDL_SERVER_INFO']
|
212
|
+
MIDL_SERVER_INFO32 = RPC_Struct_Mgr32['MIDL_SERVER_INFO']
|
213
|
+
MIDL_SERVER_INFO64 = RPC_Struct_Mgr64['MIDL_SERVER_INFO']
|
214
|
+
MIDL_STUB_DESC = RPC_Struct_Mgr32['MIDL_STUB_DESC']
|
215
|
+
MIDL_STUB_DESC32 = RPC_Struct_Mgr32['MIDL_STUB_DESC']
|
216
|
+
MIDL_STUB_DESC64 = RPC_Struct_Mgr64['MIDL_STUB_DESC']
|
217
|
+
MIDL_SYNTAX_INFO = RPC_Struct_Mgr32['MIDL_SYNTAX_INFO']
|
218
|
+
MIDL_SYNTAX_INFO32 = RPC_Struct_Mgr32['MIDL_SYNTAX_INFO']
|
219
|
+
MIDL_SYNTAX_INFO64 = RPC_Struct_Mgr64['MIDL_SYNTAX_INFO']
|
220
|
+
MIDL_STUBLESS_PROXY_INFO = RPC_Struct_Mgr32['MIDL_STUBLESS_PROXY_INFO']
|
221
|
+
MIDL_STUBLESS_PROXY_INFO32 = RPC_Struct_Mgr32['MIDL_STUBLESS_PROXY_INFO']
|
222
|
+
MIDL_STUBLESS_PROXY_INFO64 = RPC_Struct_Mgr64['MIDL_STUBLESS_PROXY_INFO']
|
223
|
+
RPC_DISPATCH_TABLE_T = RPC_Struct_Mgr32['RPC_DISPATCH_TABLE_T']
|
224
|
+
RPC_DISPATCH_TABLE_T32 = RPC_Struct_Mgr32['RPC_DISPATCH_TABLE_T']
|
225
|
+
RPC_DISPATCH_TABLE_T64 = RPC_Struct_Mgr64['RPC_DISPATCH_TABLE_T']
|
226
|
+
|
227
|
+
GUID = RPC_Struct_Mgr32['GUID']
|
228
|
+
RPC_VERSION = RPC_Struct_Mgr32['RPC_VERSION']
|
229
|
+
RPC_SYNTAX_IDENTIFIER = RPC_Struct_Mgr32['RPC_SYNTAX_IDENTIFIER']
|
230
|
+
RPC_SYNTAX_IDENTIFIER64 = RPC_Struct_Mgr64['RPC_SYNTAX_IDENTIFIER']
|
231
|
+
RPC_IF_ID = RPC_SYNTAX_IDENTIFIER
|
232
|
+
|
233
|
+
def self.from_guid_str(guid_str)
|
234
|
+
if guid_str.count('-') == 3
|
235
|
+
hexData1, hexData2, hexData3, hexData4 = guid_str.split('-')
|
236
|
+
|
237
|
+
data1 = hexData1.to_i(16)
|
238
|
+
data2 = hexData2.to_i(16)
|
239
|
+
data3 = hexData3.to_i(16)
|
240
|
+
data4 = [hexData4.to_i(16)].pack('Q<').unpack('CCCCCCCC')
|
241
|
+
|
242
|
+
guid_struct = GUID.make
|
243
|
+
guid_struct['data1'].value = data1
|
244
|
+
guid_struct['data2'].value = data2
|
245
|
+
guid_struct['data3'].value = data3
|
246
|
+
|
247
|
+
data4.each_with_index do |c, i|
|
248
|
+
guid_struct['data4'][i].value = c
|
249
|
+
end
|
250
|
+
|
251
|
+
guid_struct
|
252
|
+
elsif guid_str.count('-') == 4
|
253
|
+
hexData1, hexData2, hexData3, hexData4Hi, hexData4 = guid_str.split('-')
|
254
|
+
|
255
|
+
data1 = hexData1.to_i(16)
|
256
|
+
data2 = hexData2.to_i(16)
|
257
|
+
data3 = hexData3.to_i(16)
|
258
|
+
data4Hi = hexData4Hi.to_i(16)
|
259
|
+
data4 = []
|
260
|
+
|
261
|
+
(0...hexData4.length).step(2) do |i|
|
262
|
+
data4 << hexData4[i...i + 2].to_i(16)
|
263
|
+
end
|
264
|
+
|
265
|
+
guid_struct = GUID.make
|
266
|
+
guid_struct['data1'].value = data1
|
267
|
+
guid_struct['data2'].value = data2
|
268
|
+
guid_struct['data3'].value = data3
|
269
|
+
guid_struct['data4'][0].value = data4Hi >> 8
|
270
|
+
guid_struct['data4'][1].value = data4Hi & 0xff
|
271
|
+
|
272
|
+
data4.each_with_index do |c, i|
|
273
|
+
guid_struct['data4'][i + 2].value = c
|
274
|
+
end
|
275
|
+
|
276
|
+
guid_struct
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
def self.make_transferSyntax(guid, majorVersion, minorVersion)
|
281
|
+
ident = RPC_SYNTAX_IDENTIFIER.make
|
282
|
+
ident['syntaxGUID'].from_s from_guid_str(guid).to_s
|
283
|
+
ident['syntaxVersion'][0].value = majorVersion
|
284
|
+
ident['syntaxVersion'][1].value = minorVersion
|
285
|
+
|
286
|
+
ident
|
287
|
+
end
|
288
|
+
|
289
|
+
DCE_TransferSyntax = make_transferSyntax('8A885D04-1CEB-11C9-9FE8-08002B104860', 2, 0)
|
290
|
+
NDR64_TransferSyntax = make_transferSyntax('71710533-BEBA-4937-8319-B5DBEF9CCC36', 1, 0)
|
291
|
+
|
292
|
+
module InterfaceType
|
293
|
+
UNKNOWN = 0
|
294
|
+
RPC = 1
|
295
|
+
DCOM = 2
|
296
|
+
OLE = 3
|
297
|
+
end
|
298
|
+
|
299
|
+
module InterfaceFlag
|
300
|
+
RPC_IF_AUTOLISTEN = 0x0001
|
301
|
+
RPC_IF_OLE = 0x0002
|
302
|
+
RPC_IF_ALLOW_UNKNOWN_AUTHORITY = 0x0004
|
303
|
+
RPC_IF_ALLOW_SECURE_ONLY = 0x0008
|
304
|
+
RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH = 0x0010
|
305
|
+
RPC_IF_ALLOW_LOCAL_ONLY = 0x0020
|
306
|
+
RPC_IF_SEC_NO_CACHE = 0x0040
|
307
|
+
RPC_IF_SEC_CACHE_PER_PROC = 0x0080
|
308
|
+
RPC_IF_ASYNC_CALLBACK = 0x0100
|
309
|
+
|
310
|
+
MAPPING = {
|
311
|
+
rpc_if_autolisten: 0x1,
|
312
|
+
rpc_if_ole: 0x2,
|
313
|
+
rpc_if_allow_unknown_authority: 0x4,
|
314
|
+
rpc_if_allow_secure_only: 0x8,
|
315
|
+
rpc_if_allow_callbacks_with_no_auth: 0x10,
|
316
|
+
rpc_if_allow_local_only: 0x20,
|
317
|
+
rpc_if_sec_no_cache: 0x40,
|
318
|
+
rpc_if_sec_cache_per_proc: 0x80,
|
319
|
+
rpc_if_async_callback: 0x100
|
320
|
+
}
|
321
|
+
end
|
322
|
+
|
323
|
+
class MIDL_SWITCHES
|
324
|
+
SWITCHES = %w[Oi Oic Oif Oicf Os ndr64 all win64 amd64 ia64]
|
325
|
+
attr_reader :value
|
326
|
+
|
327
|
+
def initialize
|
328
|
+
@value = 0
|
329
|
+
end
|
330
|
+
|
331
|
+
def add(switch)
|
332
|
+
return @value if has_switch?(switch)
|
333
|
+
@value |= mapping_midl_switch(switch)
|
334
|
+
end
|
335
|
+
|
336
|
+
def remove(switch)
|
337
|
+
@value &= ~mapping_midl_switch(switch)
|
338
|
+
end
|
339
|
+
|
340
|
+
def has_switch?(switch)
|
341
|
+
integer = mapping_midl_switch(switch)
|
342
|
+
!integer.zero? && (@value & integer) == integer
|
343
|
+
end
|
344
|
+
|
345
|
+
def has_one_of_switches?(switch)
|
346
|
+
switch.each { |s| return true if has_switch?(s) }
|
347
|
+
false
|
348
|
+
end
|
349
|
+
|
350
|
+
def has_all_of_switches?(switch)
|
351
|
+
res = true
|
352
|
+
switch.map {|s|res = false unless has_switch?(s)}
|
353
|
+
res
|
354
|
+
end
|
355
|
+
|
356
|
+
def arch_64?
|
357
|
+
has_one_of_switches?(%w[win64 amd64 ia64])
|
358
|
+
end
|
359
|
+
|
360
|
+
def mapping_midl_switch(switch)
|
361
|
+
switch = [switch] if switch.is_a?(String)
|
362
|
+
case switch
|
363
|
+
when Array
|
364
|
+
(switch & SWITCHES).map do |s|
|
365
|
+
2**SWITCHES.index(s)
|
366
|
+
end.inject(0, :+)
|
367
|
+
when Integer
|
368
|
+
SWITCHES.reject do |s|
|
369
|
+
((switch || 0) & 2**SWITCHES.index(s)).zero?
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
def to_array
|
375
|
+
mapping_midl_switch(@value)
|
376
|
+
end
|
377
|
+
|
378
|
+
def to_s
|
379
|
+
mapping_midl_switch(@value).join(', ')
|
380
|
+
end
|
381
|
+
|
382
|
+
alias_method :<<, :add
|
383
|
+
end
|
384
|
+
|
385
|
+
|
386
|
+
class Structures_Klass
|
387
|
+
attr_accessor :xrefs
|
388
|
+
|
389
|
+
def initialize(cstruct)
|
390
|
+
@xrefs = []
|
391
|
+
@value_table = {}
|
392
|
+
@cstruct = cstruct
|
393
|
+
parse_struct(cstruct)
|
394
|
+
end
|
395
|
+
|
396
|
+
def to_s
|
397
|
+
@cstruct.to_s
|
398
|
+
end
|
399
|
+
|
400
|
+
def [](key)
|
401
|
+
self.send key
|
402
|
+
end
|
403
|
+
|
404
|
+
def method_missing(m, *args)
|
405
|
+
if m.to_s.end_with?('_Value')
|
406
|
+
key = m.to_s.split('_Value')[0].to_sym
|
407
|
+
@value_table[key]
|
408
|
+
elsif @value_table.keys.map(&:downcase).include?(m.downcase)
|
409
|
+
self.define_singleton_method(m) do
|
410
|
+
@value_table[m]
|
411
|
+
end
|
412
|
+
@value_table[m]
|
413
|
+
else
|
414
|
+
super(m, *args)
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
def link_and_xref(var_name, struct)
|
419
|
+
self.instance_variable_set ('@'+var_name.to_s).to_sym, struct
|
420
|
+
var = struct
|
421
|
+
xref_from(struct) unless struct.is_a?(Array)
|
422
|
+
end
|
423
|
+
|
424
|
+
def xref_from(cstruct)
|
425
|
+
cstruct.xrefs << self
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
class GUID_Klass < Structures_Klass
|
430
|
+
def initialize(cstruct)
|
431
|
+
parse_struct(cstruct)
|
432
|
+
end
|
433
|
+
|
434
|
+
def parse_struct(cstruct)
|
435
|
+
@value_table = {
|
436
|
+
Data1: cstruct['data1'],
|
437
|
+
Data2: cstruct['data2'],
|
438
|
+
Data3: cstruct['data3'],
|
439
|
+
Data4: cstruct['data4']
|
440
|
+
}
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
class RPC_VERSION_Klass < Structures_Klass
|
445
|
+
def parse_struct(cstruct)
|
446
|
+
@value_table = {
|
447
|
+
MajorVersion: cstruct['majorVersion'],
|
448
|
+
MinorVersion: cstruct['minorVersion']
|
449
|
+
}
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
453
|
+
class RPC_SYNTAX_IDENTIFIER_Klass < Structures_Klass
|
454
|
+
attr_accessor :type
|
455
|
+
|
456
|
+
def parse_struct(cstruct)
|
457
|
+
@value_table = {
|
458
|
+
SyntaxGUID: cstruct['syntaxGUID'].to_s,
|
459
|
+
SyntaxVersion:cstruct['syntaxVersion'].to_s
|
460
|
+
}
|
461
|
+
|
462
|
+
@type = :interface_id
|
463
|
+
guid = @value_table[:SyntaxGUID]
|
464
|
+
if guid == DCE_TransferSyntax.to_s || guid == NDR64_TransferSyntax.to_s
|
465
|
+
@type = :transfer_syntax
|
466
|
+
end
|
467
|
+
|
468
|
+
@syntax_guid_link_to = GUID_Klass.new(cstruct['syntaxGUID'])
|
469
|
+
@syntax_version_link_to = RPC_VERSION_Klass.new(cstruct['syntaxVersion'])
|
470
|
+
|
471
|
+
true
|
472
|
+
end
|
473
|
+
|
474
|
+
def SyntaxGUID
|
475
|
+
@syntax_guid_link_to || @value_table[:SyntaxGUID]
|
476
|
+
end
|
477
|
+
|
478
|
+
def SyntaxVersion
|
479
|
+
@syntax_version_link_to || @value_table[:SyntaxVersion]
|
480
|
+
end
|
481
|
+
|
482
|
+
def link_to(struct)
|
483
|
+
case struct
|
484
|
+
when GUID_Klass
|
485
|
+
link_and_xref :syntax_guid_link_to, struct
|
486
|
+
when RPC_VERSION_Klass
|
487
|
+
link_and_xref :syntax_version_link_to, struct
|
488
|
+
end
|
489
|
+
end
|
490
|
+
end
|
491
|
+
|
492
|
+
class RPC_DISPATCH_TABLE_Klass < Structures_Klass
|
493
|
+
def parse_struct(cstruct)
|
494
|
+
@value_table = {
|
495
|
+
DispatchTableCount: cstruct['dispatchTableCount'].value,
|
496
|
+
DispatchTable: cstruct['dispatchTable'].to_s,
|
497
|
+
Reserved: cstruct['seserved'].to_s
|
498
|
+
}
|
499
|
+
|
500
|
+
@dispatch_table_link_to = nil
|
501
|
+
end
|
502
|
+
|
503
|
+
|
504
|
+
def DispatchTable
|
505
|
+
@dispatch_table_link_to || @value_table[:DispatchTable]
|
506
|
+
end
|
507
|
+
|
508
|
+
def DispatchFunctions # Virtual Field
|
509
|
+
self.DispatchTable
|
510
|
+
end
|
511
|
+
|
512
|
+
def link_to(dispatch_funcs)
|
513
|
+
if dispatch_funcs.is_a?(Array)
|
514
|
+
@dispatch_table_link_to = dispatch_funcs
|
515
|
+
end
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
class RPC_SERVER_INTERFACE_Klass < Structures_Klass
|
520
|
+
def parse_struct(cstruct)
|
521
|
+
@value_table = {
|
522
|
+
Length: cstruct['length'].value,
|
523
|
+
InterfaceId: cstruct['interfaceId'].to_s,
|
524
|
+
TransferSyntax: cstruct['transferSyntax'].to_s,
|
525
|
+
DispatchTable: cstruct['dispatchTable'].value,
|
526
|
+
RpcProtseqEndpointCount: cstruct['rpcProtseqEndpointCount'].value,
|
527
|
+
RpcProtseqEndpoint: cstruct['rpcProtseqEndpoint'].value,
|
528
|
+
DefaultManagerEpv: cstruct['defaultManagerEpv'].value,
|
529
|
+
InterpreterInfo: cstruct['interpreterInfo'].value,
|
530
|
+
Flags: cstruct['flags'].value
|
531
|
+
}
|
532
|
+
|
533
|
+
@interface_id_link_to = nil
|
534
|
+
link_and_xref :interface_id_link_to, RPC_SYNTAX_IDENTIFIER_Klass.new(cstruct['interfaceId'])
|
535
|
+
link_and_xref :transfer_syntax_link_to, RPC_SYNTAX_IDENTIFIER_Klass.new(cstruct['transferSyntax'])
|
536
|
+
@interpreterInfo_link_to = nil
|
537
|
+
@dispatch_table_link_to = nil
|
538
|
+
|
539
|
+
true
|
540
|
+
end
|
541
|
+
|
542
|
+
def ndr64?
|
543
|
+
NDR64_TransferSyntax.to_s == @value_table[:TransferSyntax]
|
544
|
+
end
|
545
|
+
|
546
|
+
def dce?
|
547
|
+
DCE_TransferSyntax.to_s == @value_table[:TransferSyntax]
|
548
|
+
end
|
549
|
+
|
550
|
+
def dispatch_table_nullptr?
|
551
|
+
@value_table[:DispatchTable] == 0
|
552
|
+
end
|
553
|
+
|
554
|
+
def interpreter_info_nullptr?
|
555
|
+
@value_table[:InterpreterInfo] == 0
|
556
|
+
end
|
557
|
+
|
558
|
+
def server_routines
|
559
|
+
unless interpreter_info_nullptr?
|
560
|
+
begin
|
561
|
+
routines = self.InterpreterInfo.server_routines
|
562
|
+
return routines
|
563
|
+
end
|
564
|
+
end
|
565
|
+
|
566
|
+
[]
|
567
|
+
end
|
568
|
+
|
569
|
+
def InterfaceId
|
570
|
+
@interface_id_link_to || @value_table[:InterfaceId]
|
571
|
+
end
|
572
|
+
|
573
|
+
def TransferSyntax
|
574
|
+
@transfer_syntax_link_to || @value_table[:TransferSyntax]
|
575
|
+
end
|
576
|
+
|
577
|
+
def DispatchTable
|
578
|
+
@dispatch_table_link_to || @value_table[:DispatchTable]
|
579
|
+
end
|
580
|
+
|
581
|
+
def InterpreterInfo
|
582
|
+
@interpreterInfo_link_to || @value_table[:InterpreterInfo]
|
583
|
+
end
|
584
|
+
|
585
|
+
def link_to(struct)
|
586
|
+
if struct.to_s == DCE_TransferSyntax.to_s || struct.to_s == NDR64_TransferSyntax.to_s
|
587
|
+
return link_and_xref(:transfer_syntax_link_to, struct)
|
588
|
+
end
|
589
|
+
|
590
|
+
case struct
|
591
|
+
when RPC_SYNTAX_IDENTIFIER_Klass
|
592
|
+
case struct.type
|
593
|
+
when :interface_id
|
594
|
+
link_and_xref :interface_id_link_to, struct
|
595
|
+
when :transfer_syntax
|
596
|
+
link_and_xref :transfer_syntax_link_to, struct
|
597
|
+
end
|
598
|
+
when MIDL_SERVER_INFO_Klass
|
599
|
+
link_and_xref :interpreterInfo_link_to, struct
|
600
|
+
when RPC_DISPATCH_TABLE_Klass
|
601
|
+
link_and_xref :dispatch_table_link_to, struct
|
602
|
+
when MIDL_STUBLESS_PROXY_INFO_Klass
|
603
|
+
link_and_xref :interpreterInfo_link_to, struct
|
604
|
+
end
|
605
|
+
end
|
606
|
+
end
|
607
|
+
|
608
|
+
class SERVER_ROUTINE_Klass < Structures_Klass
|
609
|
+
attr_reader :addr
|
610
|
+
attr_reader :proc_num
|
611
|
+
|
612
|
+
def initialize(routine)
|
613
|
+
@addr = routine
|
614
|
+
@proc_num = nil
|
615
|
+
end
|
616
|
+
end
|
617
|
+
|
618
|
+
class CLIENT_ROUTINE_Klass < Structures_Klass
|
619
|
+
attr_reader :addr
|
620
|
+
attr_accessor :proc_num
|
621
|
+
|
622
|
+
def initialize(routine, opts = {})
|
623
|
+
@addr = routine
|
624
|
+
@proc_num = opts[:proc_num]
|
625
|
+
end
|
626
|
+
end
|
627
|
+
|
628
|
+
class MIDL_SERVER_INFO_Klass < Structures_Klass
|
629
|
+
def parse_struct(cstruct)
|
630
|
+
@value_table = {
|
631
|
+
pStubDesc: cstruct['pStubDesc'].value,
|
632
|
+
DispatchTable: cstruct['dispatchTable'].value,
|
633
|
+
ProcString: cstruct['procString'].value,
|
634
|
+
ProcFormatString: cstruct['procString'].value, # alias of ProcString
|
635
|
+
FmtStringOffset: cstruct['fmtStringOffset'].value,
|
636
|
+
FormatStringOffset: cstruct['fmtStringOffset'].value, # alias of FmtStringOffset
|
637
|
+
ThunkTable: cstruct['thunkTable'].value,
|
638
|
+
pTransferSyntax: cstruct['pTransferSyntax'].value,
|
639
|
+
nCount: cstruct['nCount'].value,
|
640
|
+
pSyntaxInfo: cstruct['pSyntaxInfo'].value
|
641
|
+
}
|
642
|
+
|
643
|
+
@dispatch_table_link_to = nil
|
644
|
+
@syntax_info_link_to = nil
|
645
|
+
@transfer_syntax_link_to = nil
|
646
|
+
@stub_desc_link_to = nil
|
647
|
+
|
648
|
+
true
|
649
|
+
end
|
650
|
+
|
651
|
+
def server_routines
|
652
|
+
self.DispatchTable rescue nil
|
653
|
+
end
|
654
|
+
|
655
|
+
def DispatchTable
|
656
|
+
@dispatch_table_link_to || @value_table[:DispatchTable]
|
657
|
+
end
|
658
|
+
|
659
|
+
def pStubDesc
|
660
|
+
@stub_desc_link_to || @value_table[:pStubDesc]
|
661
|
+
end
|
662
|
+
|
663
|
+
def pSyntaxInfo
|
664
|
+
@syntax_info_link_to || @value_table[:pSyntaxInfo]
|
665
|
+
end
|
666
|
+
|
667
|
+
def link_to(struct)
|
668
|
+
case struct
|
669
|
+
when Array
|
670
|
+
@dispatch_table_link_to = struct
|
671
|
+
when MIDL_STUB_DESC_Klass
|
672
|
+
link_and_xref :stub_desc_link_to, struct
|
673
|
+
when MIDL_SYNTAX_INFO_Klass, Array
|
674
|
+
link_and_xref :syntax_info_link_to, struct
|
675
|
+
end
|
676
|
+
end
|
677
|
+
end
|
678
|
+
|
679
|
+
class MIDL_SYNTAX_INFO_Klass < Structures_Klass
|
680
|
+
def parse_struct(cstruct)
|
681
|
+
@value_table = {
|
682
|
+
TransferSyntax: cstruct['transferSyntax'],
|
683
|
+
DispatchTable: cstruct['dispatchTable'].value,
|
684
|
+
ProcString: cstruct['procString'].value,
|
685
|
+
FmtStringOffset: cstruct['fmtStringOffset'].value,
|
686
|
+
TypeString: cstruct['typeString'].value,
|
687
|
+
aUserMarshalQuadruple: cstruct['aUserMarshalQuadruple'].value,
|
688
|
+
pMethodProperties: cstruct['pMethodProperties'].value,
|
689
|
+
pReserved2: cstruct['pReserved2'].value
|
690
|
+
}
|
691
|
+
|
692
|
+
@dispatch_table_link_to = nil
|
693
|
+
end
|
694
|
+
|
695
|
+
def DispatchTable
|
696
|
+
@dispatch_table_link_to || @value_table[:DispatchTable]
|
697
|
+
end
|
698
|
+
|
699
|
+
def link_to(struct)
|
700
|
+
if struct.is_a? RPC_DISPATCH_TABLE_Klass
|
701
|
+
link_and_xref :dispatch_table_link_to, struct
|
702
|
+
end
|
703
|
+
end
|
704
|
+
end
|
705
|
+
|
706
|
+
class MIDL_STUBLESS_PROXY_INFO_Klass < Structures_Klass
|
707
|
+
def parse_struct(cstruct)
|
708
|
+
@value_table = {
|
709
|
+
pStubDesc: cstruct['pStubDesc'].value,
|
710
|
+
ProcFormatString: cstruct['procFormatString'].value,
|
711
|
+
FormatStringOffset: cstruct['formatStringOffset'].value,
|
712
|
+
pTransferSyntax: cstruct['pTransferSyntax'].value,
|
713
|
+
nCount: cstruct['nCount'].value,
|
714
|
+
pSyntaxInfo: cstruct['pSyntaxInfo'].value
|
715
|
+
}
|
716
|
+
|
717
|
+
@stub_desc_link_to = nil
|
718
|
+
@syntax_info_link_to = nil
|
719
|
+
@transfer_syntax_link_to = nil
|
720
|
+
end
|
721
|
+
|
722
|
+
def link_to(struct)
|
723
|
+
case struct
|
724
|
+
when MIDL_STUB_DESC_Klass
|
725
|
+
link_and_xref :stub_desc_link_to, struct
|
726
|
+
when MIDL_SYNTAX_INFO_Klass
|
727
|
+
link_and_xref :syntax_info_link_to, struct
|
728
|
+
end
|
729
|
+
end
|
730
|
+
end
|
731
|
+
|
732
|
+
class MIDL_STUB_DESC_Klass < Structures_Klass
|
733
|
+
def parse_struct(cstruct)
|
734
|
+
@value_table = {
|
735
|
+
RpcInterfaceInformation: cstruct['rpcInterfaceInformation'].value,
|
736
|
+
pfnAllocate: cstruct['pfnAllocate'].value,
|
737
|
+
pfnFree: cstruct['pfnFree'].value,
|
738
|
+
pAutoHandle: cstruct['implicit_handle_info'].value,
|
739
|
+
pPrimitiveHandle: cstruct['implicit_handle_info'].value,
|
740
|
+
pGenericBindingInfo: cstruct['implicit_handle_info'].value,
|
741
|
+
apfnNdrRundownRoutines: cstruct['apfnNdrRundownRoutines'].value,
|
742
|
+
aGenericBindingRoutinePairs: cstruct['aGenericBindingRoutinePairs'].value,
|
743
|
+
apfnExprEval: cstruct['apfnExprEval'].value,
|
744
|
+
aXmitQuintuple: cstruct['aXmitQuintuple'].value,
|
745
|
+
pFormatTypes: cstruct['pFormatTypes'].value,
|
746
|
+
fCheckBounds: cstruct['fCheckBounds'].value,
|
747
|
+
Version: cstruct['version'].value,
|
748
|
+
pMallocFreeStruct: cstruct['pMallocFreeStruct'].value,
|
749
|
+
MIDLVersion: cstruct['midlVersion'].value,
|
750
|
+
CommFaultOffsets: cstruct['commFaultOffsets'].value,
|
751
|
+
aUserMarshalQuadruple: cstruct['aUserMarshalQuadruple'].value,
|
752
|
+
NotifyRoutineTable: cstruct['notifyRoutineTable'].value,
|
753
|
+
mFlags: cstruct['mFlags'].value,
|
754
|
+
CsRoutineTables: cstruct['csRoutineTables'].value,
|
755
|
+
ProxyServerInfo: cstruct['proxyServerInfo'].value,
|
756
|
+
pExprInfo: cstruct['pExprInfo'].value
|
757
|
+
}
|
758
|
+
|
759
|
+
@interface_info_link_to = nil
|
760
|
+
@format_types_link_to = nil
|
761
|
+
|
762
|
+
true
|
763
|
+
end
|
764
|
+
|
765
|
+
def pFormatTypes
|
766
|
+
@value_table[:pFormatTypes] || @format_types_link_to
|
767
|
+
end
|
768
|
+
|
769
|
+
def link_to(struct)
|
770
|
+
if struct.is_a? RPC_SERVER_INTERFACE_Klass
|
771
|
+
link_and_xref :interface_info_link_to, struct
|
772
|
+
end
|
773
|
+
end
|
774
|
+
end
|
775
|
+
end
|
776
|
+
end
|
777
|
+
end
|