Skip to content

Commit

Permalink
[driver] Move key-name construction into reg_open()
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Brown <mbrown@fensystems.co.uk>
  • Loading branch information
mcb30 committed Aug 15, 2011
1 parent de3a431 commit 5272575
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 29 deletions.
24 changes: 2 additions & 22 deletions src/driver/ibft.c
Expand Up @@ -209,32 +209,14 @@ static NTSTATUS store_tcpip_parameters ( PDEVICE_OBJECT pdo,
PVOID opaque ) {
LPCWSTR key_name_prefix = ( L"\\Registry\\Machine\\SYSTEM\\"
L"CurrentControlSet\\Services\\"
L"Tcpip\\Parameters\\Interfaces\\" );
L"Tcpip\\Parameters\\Interfaces" );
PIBFT_NIC nic = opaque;
LPWSTR key_name;
SIZE_T key_name_len;
HANDLE reg_key;
ULONG subnet_mask;
NTSTATUS status;

/* Allocate key name */
key_name_len = ( ( wcslen ( key_name_prefix ) +
wcslen ( netcfginstanceid ) + 1 ) *
sizeof ( key_name[0] ) );
key_name = ExAllocatePoolWithTag ( NonPagedPool, key_name_len,
SANBOOTCONF_POOL_TAG );
if ( ! key_name ) {
DbgPrint ( "Could not allocate TCP/IP key name\n" );
status = STATUS_UNSUCCESSFUL;
goto err_exallocatepoolwithtag;
}

/* Construct key name */
RtlStringCbCopyW ( key_name, key_name_len, key_name_prefix );
RtlStringCbCatW ( key_name, key_name_len, netcfginstanceid );

/* Open key */
status = reg_open ( key_name, &reg_key );
status = reg_open ( &reg_key, key_name_prefix, netcfginstanceid, NULL );
if ( ! NT_SUCCESS ( status ) )
goto err_reg_open;

Expand Down Expand Up @@ -271,8 +253,6 @@ static NTSTATUS store_tcpip_parameters ( PDEVICE_OBJECT pdo,
err_reg_store:
reg_close ( reg_key );
err_reg_open:
ExFreePool ( key_name );
err_exallocatepoolwithtag:
return status;
}

Expand Down
48 changes: 42 additions & 6 deletions src/driver/registry.c
Expand Up @@ -24,26 +24,62 @@
/**
* Open registry key
*
* @v reg_key_name Registry key name
* @v reg_key Registry key to fill in
* @v ... Registry key name components, terminated with a NULL
* @ret ntstatus NT status
*/
NTSTATUS reg_open ( LPCWSTR reg_key_name, PHANDLE reg_key ) {
NTSTATUS reg_open ( PHANDLE reg_key, ... ) {
UNICODE_STRING unicode_string;
OBJECT_ATTRIBUTES object_attrs;
va_list args;
LPCWSTR key_name_part;
LPWSTR key_name;
SIZE_T key_name_len;
NTSTATUS status;

RtlInitUnicodeString ( &unicode_string, reg_key_name );
/* Calculate total buffer length */
key_name_len = 0;
va_start ( args, reg_key );
while ( ( key_name_part = va_arg ( args, LPCWSTR ) ) != NULL ) {
key_name_len += ( ( wcslen ( key_name_part ) + 1 ) *
sizeof ( key_name_part[0] ) );
}
va_end ( args );

/* Allocate buffer */
key_name = ExAllocatePoolWithTag ( NonPagedPool, key_name_len,
SANBOOTCONF_POOL_TAG );
if ( ! key_name ) {
DbgPrint ( "Could not allocate key name buffer\n" );
status = STATUS_UNSUCCESSFUL;
goto err_exallocatepoolwithtag;
}

/* Create key name */
va_start ( args, reg_key );
key_name[0] = 0;
while ( ( key_name_part = va_arg ( args, LPCWSTR ) ) != NULL ) {
if ( key_name[0] )
RtlStringCbCatW ( key_name, key_name_len, L"\\" );
RtlStringCbCatW ( key_name, key_name_len, key_name_part );
}
va_end ( args );

/* Open key */
RtlInitUnicodeString ( &unicode_string, key_name );
InitializeObjectAttributes ( &object_attrs, &unicode_string,
OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
NULL, NULL );
status = ZwOpenKey ( reg_key, KEY_ALL_ACCESS, &object_attrs );
if ( ! NT_SUCCESS ( status ) ) {
DbgPrint ( "Could not open %S: %x\n", reg_key_name, status );
return status;
DbgPrint ( "Could not open %S: %x\n", key_name, status );
goto err_zwopenkey;
}

return STATUS_SUCCESS;
err_zwopenkey:
ExFreePool ( key_name );
err_exallocatepoolwithtag:
return status;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/driver/registry.h
Expand Up @@ -19,7 +19,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

extern NTSTATUS reg_open ( LPCWSTR reg_key_name, PHANDLE reg_key );
extern NTSTATUS reg_open ( PHANDLE reg_key, ... );
extern VOID reg_close ( HANDLE reg_key );
extern NTSTATUS reg_fetch_kvi ( HANDLE reg_key, LPCWSTR value_name,
PKEY_VALUE_PARTIAL_INFORMATION *kvi );
Expand Down

0 comments on commit 5272575

Please sign in to comment.