@@ -97,21 +97,25 @@ public static NtKey LoadKey(ObjectAttributes key_obj_attr, ObjectAttributes file
9797 /// <param name="file_obj_attr">Object attributes for the path to the hive file</param>
9898 /// <param name="flags">Load flags</param>
9999 /// <param name="desired_access">Desired access for the root key</param>
100+ /// <param name="trust_key">Key that this hive will be trusted for.</param>
101+ /// <param name="key_event">Event handle for key load.</param>
100102 /// <param name="throw_on_error">True to throw an exception on error.</param>
101103 /// <returns>The NT status code and object result.</returns>
102104 public static NtResult < NtKey > LoadKey ( ObjectAttributes key_obj_attr , ObjectAttributes file_obj_attr ,
103- LoadKeyFlags flags , KeyAccessRights desired_access , bool throw_on_error )
105+ LoadKeyFlags flags , KeyAccessRights desired_access , NtKey trust_key , NtEvent key_event , bool throw_on_error )
104106 {
105107 if ( ( flags & LoadKeyFlags . AppKey ) != 0 )
106108 {
107109 return NtSystemCalls . NtLoadKeyEx ( key_obj_attr , file_obj_attr , flags ,
108- IntPtr . Zero , IntPtr . Zero , desired_access , out SafeKernelObjectHandle key_handle , 0 )
110+ trust_key . GetHandle ( ) . DangerousGetHandle ( ) , key_event . GetHandle ( ) . DangerousGetHandle ( ) ,
111+ desired_access , out SafeKernelObjectHandle key_handle , 0 )
109112 . CreateResult ( throw_on_error , ( ) => new NtKey ( key_handle , KeyDisposition . OpenedExistingKey , false ) ) ;
110113 }
111114 else
112115 {
113- var result = NtSystemCalls . NtLoadKeyExNoHandle ( key_obj_attr , file_obj_attr , flags ,
114- IntPtr . Zero , IntPtr . Zero , 0 , IntPtr . Zero , 0 ) . CreateResult < NtKey > ( throw_on_error , ( ) => null ) ;
116+ var result = NtSystemCalls . NtLoadKeyEx ( key_obj_attr , file_obj_attr , flags ,
117+ trust_key . GetHandle ( ) . DangerousGetHandle ( ) , key_event . GetHandle ( ) . DangerousGetHandle ( ) ,
118+ 0 , IntPtr . Zero , 0 ) . CreateResult < NtKey > ( throw_on_error , ( ) => null ) ;
115119 if ( ! result . IsSuccess )
116120 {
117121 return result ;
@@ -121,6 +125,117 @@ public static NtResult<NtKey> LoadKey(ObjectAttributes key_obj_attr, ObjectAttri
121125 }
122126 }
123127
128+ /// <summary>
129+ /// Load a new hive
130+ /// </summary>
131+ /// <param name="key_obj_attr">Object attributes for the key name</param>
132+ /// <param name="file_obj_attr">Object attributes for the path to the hive file</param>
133+ /// <param name="flags">Load flags</param>
134+ /// <param name="desired_access">Desired access for the root key</param>
135+ /// <param name="trust_key">Key that this hive will be trusted for.</param>
136+ /// <param name="key_event">Event handle for key load.</param>
137+ /// <returns>The opened key.</returns>
138+ public static NtKey LoadKey ( ObjectAttributes key_obj_attr , ObjectAttributes file_obj_attr ,
139+ LoadKeyFlags flags , KeyAccessRights desired_access , NtKey trust_key , NtEvent key_event )
140+ {
141+ return LoadKey ( key_obj_attr , file_obj_attr , flags , desired_access , trust_key , key_event , true ) . Result ;
142+ }
143+
144+ /// <summary>
145+ /// Load a new hive
146+ /// </summary>
147+ /// <param name="key_obj_attr">Object attributes for the key name</param>
148+ /// <param name="file_obj_attr">Object attributes for the path to the hive file</param>
149+ /// <param name="flags">Load flags</param>
150+ /// <param name="desired_access">Desired access for the root key</param>
151+ /// <param name="throw_on_error">True to throw an exception on error.</param>
152+ /// <returns>The NT status code and object result.</returns>
153+ public static NtResult < NtKey > LoadKey ( ObjectAttributes key_obj_attr , ObjectAttributes file_obj_attr ,
154+ LoadKeyFlags flags , KeyAccessRights desired_access , bool throw_on_error )
155+ {
156+ return LoadKey ( key_obj_attr , file_obj_attr , flags , desired_access , null , null , throw_on_error ) ;
157+ }
158+
159+ /// <summary>
160+ /// Load a new hive
161+ /// </summary>
162+ /// <param name="key_obj_attr">Object attributes for the key name</param>
163+ /// <param name="file_obj_attr">Object attributes for the path to the hive file</param>
164+ /// <param name="flags">Load flags</param>
165+ /// <param name="desired_access">Desired access for the root key</param>
166+ /// <param name="token">Token to open the hive files under.</param>
167+ /// <param name="trust_key">Key that this hive will be trusted for.</param>
168+ /// <param name="key_event">Event handle for key load.</param>
169+ /// <param name="throw_on_error">True to throw an exception on error.</param>
170+ /// <returns>The NT status code and object result.</returns>
171+ public static NtResult < NtKey > LoadKey ( ObjectAttributes key_obj_attr , ObjectAttributes file_obj_attr ,
172+ LoadKeyFlags flags , KeyAccessRights desired_access , NtKey trust_key , NtEvent key_event , NtToken token , bool throw_on_error )
173+ {
174+ if ( token == null )
175+ {
176+ return LoadKey ( key_obj_attr , file_obj_attr , flags , desired_access , trust_key , key_event , throw_on_error ) ;
177+ }
178+
179+ List < KeyLoadArgument > args = new List < KeyLoadArgument > ( ) ;
180+ if ( trust_key != null )
181+ {
182+ args . Add ( new KeyLoadArgument ( )
183+ {
184+ ArgumentType = KeyLoadArgumentType . TrustKeyHandle ,
185+ Argument = trust_key . Handle . DangerousGetHandle ( )
186+ } ) ;
187+ }
188+
189+ if ( key_event != null )
190+ {
191+ args . Add ( new KeyLoadArgument ( )
192+ {
193+ ArgumentType = KeyLoadArgumentType . EventHandle ,
194+ Argument = key_event . Handle . DangerousGetHandle ( )
195+ } ) ;
196+ }
197+ args . Add ( new KeyLoadArgument ( )
198+ {
199+ ArgumentType = KeyLoadArgumentType . TokenHandle ,
200+ Argument = token . Handle . DangerousGetHandle ( )
201+ } ) ;
202+
203+ if ( ( flags & LoadKeyFlags . AppKey ) != 0 )
204+ {
205+ return NtSystemCalls . NtLoadKey3 ( key_obj_attr , file_obj_attr , flags ,
206+ args . ToArray ( ) , args . Count , desired_access , out SafeKernelObjectHandle key_handle , 0 )
207+ . CreateResult ( throw_on_error , ( ) => new NtKey ( key_handle , KeyDisposition . OpenedExistingKey , false ) ) ;
208+ }
209+ else
210+ {
211+ var result = NtSystemCalls . NtLoadKey3 ( key_obj_attr , file_obj_attr , flags ,
212+ args . ToArray ( ) , args . Count , 0 , IntPtr . Zero , 0 ) . CreateResult < NtKey > ( throw_on_error , ( ) => null ) ;
213+ if ( ! result . IsSuccess )
214+ {
215+ return result ;
216+ }
217+
218+ return Open ( key_obj_attr , desired_access , KeyCreateOptions . NonVolatile , throw_on_error ) ;
219+ }
220+ }
221+
222+ /// <summary>
223+ /// Load a new hive
224+ /// </summary>
225+ /// <param name="key_obj_attr">Object attributes for the key name</param>
226+ /// <param name="file_obj_attr">Object attributes for the path to the hive file</param>
227+ /// <param name="flags">Load flags</param>
228+ /// <param name="desired_access">Desired access for the root key</param>
229+ /// <param name="token">Token to open the hive files under.</param>
230+ /// <param name="trust_key">Key that this hive will be trusted for.</param>
231+ /// <param name="key_event">Event handle for key load.</param>
232+ /// <returns>The loaded key.</returns>
233+ public static NtKey LoadKey ( ObjectAttributes key_obj_attr , ObjectAttributes file_obj_attr ,
234+ LoadKeyFlags flags , KeyAccessRights desired_access , NtKey trust_key , NtEvent key_event , NtToken token )
235+ {
236+ return LoadKey ( key_obj_attr , file_obj_attr , flags , desired_access , trust_key , key_event , token , true ) . Result ;
237+ }
238+
124239 /// <summary>
125240 /// Unload an existing hive.
126241 /// </summary>
0 commit comments