//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1999 // // File: registry.c // //-------------------------------------------------------------------------- #include "pch.h" NTSTATUS PptRegGetDeviceParameterDword( IN PDEVICE_OBJECT Pdo, IN PWSTR ParameterName, IN OUT PULONG ParameterValue ) /*++ Routine Description: retrieve a devnode registry parameter of type dword Arguments: Pdo - ParPort PDO ParameterName - parameter name to look up ParameterValue - default parameter value Return Value: Status - if RegKeyValue does not exist or other failure occurs, then default is returned via ParameterValue --*/ { NTSTATUS status; HANDLE hKey; RTL_QUERY_REGISTRY_TABLE queryTable[2]; ULONG defaultValue; PAGED_CODE(); status = IoOpenDeviceRegistryKey(Pdo, PLUGPLAY_REGKEY_DEVICE, KEY_READ, &hKey); if(!NT_SUCCESS(status)) { return status; } defaultValue = *ParameterValue; RtlZeroMemory(&queryTable, sizeof(queryTable)); queryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[0].Name = ParameterName; queryTable[0].EntryContext = ParameterValue; queryTable[0].DefaultType = REG_DWORD; queryTable[0].DefaultData = &defaultValue; queryTable[0].DefaultLength = sizeof(ULONG); status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, hKey, queryTable, NULL, NULL); if ( !NT_SUCCESS(status) ) { *ParameterValue = defaultValue; } ZwClose(hKey); return status; } NTSTATUS PptRegSetDeviceParameterDword( IN PDEVICE_OBJECT Pdo, IN PWSTR ParameterName, IN PULONG ParameterValue ) /*++ Routine Description: Create/set a devnode registry parameter of type dword Arguments: Pdo - ParPort PDO ParameterName - parameter name ParameterValue - parameter value Return Value: Status - status from attempt --*/ { NTSTATUS status; HANDLE hKey; UNICODE_STRING valueName; PPDO_EXTENSION pdx = Pdo->DeviceExtension; PAGED_CODE(); status = IoOpenDeviceRegistryKey(Pdo, PLUGPLAY_REGKEY_DEVICE, KEY_WRITE, &hKey); if( !NT_SUCCESS( status ) ) { DD((PCE)pdx,DDE,"PptRegSetDeviceParameterDword - openKey FAILED w/status=%x",status); return status; } RtlInitUnicodeString( &valueName, ParameterName ); status = ZwSetValueKey( hKey, &valueName, 0, REG_DWORD, ParameterValue, sizeof(ULONG) ); if( !NT_SUCCESS( status ) ) { DD((PCE)pdx,DDE,"PptRegSetDeviceParameterDword - setValue FAILED w/status=%x",status); } ZwClose(hKey); return status; } /************************************************************************/ /* PptRegGetDword */ /************************************************************************/ // // Routine Description: // // Read a REG_DWORD from the registry. This is a wrapper for // function RtlQueryRegistryValues. // // Arguments: // // RelativeTo - starting point for the Path // Path - path to the registry key // ParameterName - name of the value to be read // ParameterValue - used to return the DWORD value read from the registry // // Return Value: // // NTSTATUS // // Notes: // // - On an ERROR or if the requested registry value does not exist, // *ParameterValue retains its original value. // // Log: // /************************************************************************/ NTSTATUS PptRegGetDword( IN ULONG RelativeTo, IN PWSTR Path, IN PWSTR ParameterName, IN OUT PULONG ParameterValue ) { NTSTATUS status; RTL_QUERY_REGISTRY_TABLE paramTable[2]; ULONG defaultValue; if( ( NULL == Path ) || ( NULL == ParameterName ) || ( NULL == ParameterValue ) ) { return STATUS_INVALID_PARAMETER; } DD(NULL,DDT,"PptRegGetDword - RelativeTo= %x, Path=<%S>, ParameterName=<%S>\n", RelativeTo, Path, ParameterName); // // set up table entries for call to RtlQueryRegistryValues // // leave paramTable[1] as all zeros to terminate the table // // use original value as default value // // use RtlQueryRegistryValues to do the grunge work // RtlZeroMemory( paramTable, sizeof(paramTable) ); defaultValue = *ParameterValue; paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; paramTable[0].Name = ParameterName; paramTable[0].EntryContext = ParameterValue; paramTable[0].DefaultType = REG_DWORD; paramTable[0].DefaultData = &defaultValue; paramTable[0].DefaultLength = sizeof(ULONG); status = RtlQueryRegistryValues( RelativeTo | RTL_REGISTRY_OPTIONAL, Path, ¶mTable[0], NULL, NULL); if( status != STATUS_SUCCESS ) { DD(NULL,DDW,"PptRegGetDword - RtlQueryRegistryValues FAILED w/status=%x\n",status); } DD(NULL,DDT,"PptRegGetDword - post-query <%S> *ParameterValue = %x\n", ParameterName, *ParameterValue); return status; } /************************************************************************/ /* PptRegSetDword */ /************************************************************************/ // // Routine Description: // // Write a REG_DWORD to the registry. This is a wrapper for // function RtlWriteRegistryValue. // // Arguments: // // RelativeTo - starting point for the Path // Path - path to the registry key // ParameterName - name of the value to write // ParameterValue - points to the DWORD value to write to the registry // // Return Value: // // NTSTATUS // // Notes: // // Log: // /************************************************************************/ NTSTATUS PptRegSetDword( IN ULONG RelativeTo, IN PWSTR Path, IN PWSTR ParameterName, IN PULONG ParameterValue ) { NTSTATUS status; if( (NULL == Path) || (NULL == ParameterName) || (NULL == ParameterValue) ) { status = STATUS_INVALID_PARAMETER; } else { status = RtlWriteRegistryValue( RelativeTo, Path, ParameterName, REG_DWORD, ParameterValue, sizeof(ULONG) ); } return status; } /************************************************************************/ /* PptRegGetSz */ /************************************************************************/ // // Routine Description: // // Read a REG_SZ from the registry. This is a wrapper for // function RtlQueryRegistryValues. // // Arguments: // // RelativeTo - starting point for the Path // Path - path to the registry key // ParameterName - name of the value to be read // ParameterValue - points to a UNICODE_STRING structure used to return // the REG_SZ read from the registry // // Return Value: // // NTSTATUS // // // Notes: // // - All fields of *ParameterValue UNICODE_STRING structure must be // initialized to zero by the caller. // - On SUCCESS ParameterValue->Buffer points to an allocated buffer. The // caller is responsible for freeing this buffer when done. // - On SUCCESS ParameterValue->Buffer is UNICODE_NULL terminated and is // safe to use as a PWSTR. // // Log: // /************************************************************************/ NTSTATUS PptRegGetSz( IN ULONG RelativeTo, IN PWSTR Path, IN PWSTR ParameterName, IN OUT PUNICODE_STRING ParameterValue ) { NTSTATUS status; RTL_QUERY_REGISTRY_TABLE paramTable[2]; // // sanity check parameters - reject NULL pointers and invalid // UNICODE_STRING field initializations // if( ( NULL == Path ) || ( NULL == ParameterName ) || ( NULL == ParameterValue ) ) { return STATUS_INVALID_PARAMETER; } if( (ParameterValue->Length != 0) || (ParameterValue->MaximumLength !=0) || (ParameterValue->Buffer != NULL) ) { return STATUS_INVALID_PARAMETER; } DD(NULL,DDT,"PptRegGetSz - RelativeTo=%x, Path=<%S>, ParameterName=<%S>\n", RelativeTo, Path, ParameterName); // // set up table entries for call to RtlQueryRegistryValues // // leave paramTable[1] as all zeros to terminate the table // // use RtlQueryRegistryValues to do the grunge work // RtlZeroMemory( paramTable, sizeof(paramTable) ); paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; paramTable[0].Name = ParameterName; paramTable[0].EntryContext = ParameterValue; paramTable[0].DefaultType = REG_SZ; paramTable[0].DefaultData = L""; paramTable[0].DefaultLength = 0; status = RtlQueryRegistryValues( RelativeTo | RTL_REGISTRY_OPTIONAL, Path, ¶mTable[0], NULL, NULL); if( status != STATUS_SUCCESS ) { DD(NULL,DDW,"PptRegGetSz - RtlQueryRegistryValues FAILED w/status=%x\n",status); } // // Try to make ParameterValue->Buffer safe to use as a PWSTR parameter. // Clean up the allocation and fail this request if we are unable to do so. // if( (STATUS_SUCCESS == status) && (ParameterValue->Buffer != NULL) ) { if( ParameterValue->MaximumLength >= (ParameterValue->Length + sizeof(WCHAR)) ) { (ParameterValue->Buffer)[ ParameterValue->Length / sizeof(WCHAR) ] = UNICODE_NULL; DD(NULL,DDT,"PptRegGetSz - post-query *ParameterValue=<%S>\n", ParameterValue->Buffer); } else { ExFreePool( ParameterValue->Buffer ); ParameterValue->Length = 0; ParameterValue->MaximumLength = 0; ParameterValue->Buffer = 0; status = STATUS_UNSUCCESSFUL; } } return status; } /************************************************************************/ /* PptRegSetSz */ /************************************************************************/ // // Routine Description: // // Write a REG_SZ to the registry. This is a wrapper for // function RtlWriteRegistryValue. // // Arguments: // // RelativeTo - starting point for the Path // Path - path to the registry key // ParameterName - name of the value to write // ParameterValue - points to the PWSTR to write to the registry // // Return Value: // // NTSTATUS // // Notes: // // Log: // /************************************************************************/ NTSTATUS PptRegSetSz( IN ULONG RelativeTo, IN PWSTR Path, IN PWSTR ParameterName, IN PWSTR ParameterValue ) { NTSTATUS status; if( (NULL == Path) || (NULL == ParameterName) || (NULL == ParameterValue) ) { status = STATUS_INVALID_PARAMETER; } else { status = RtlWriteRegistryValue( RelativeTo, Path, ParameterName, REG_SZ, ParameterValue, ( wcslen(ParameterValue) + sizeof(CHAR) ) * sizeof(WCHAR) ); } return status; }