NTSTATUS NtRegReadConfigString( PLWREG_CONFIG_REG pReg, PCSTR pszName, BOOLEAN bUsePolicy, PSTR *ppszValue, PDWORD pdwSize ) { NTSTATUS ntStatus = STATUS_SUCCESS; BOOLEAN bGotValue = FALSE; PSTR pszValue = NULL; DWORD dwType; DWORD dwSize = 0; if ( bUsePolicy ) { if (!pReg->pszPolicyKey) { ntStatus = STATUS_INVALID_PARAMETER; BAIL_ON_NT_STATUS(ntStatus); } ntStatus = NtRegGetValueA( pReg->hConnection, pReg->hKey, pReg->pszPolicyKey, pszName, RRF_RT_REG_SZ, &dwType, NULL, &dwSize); if (!ntStatus) { if (dwSize > 0) { ntStatus = LW_RTL_ALLOCATE(&pszValue, char, dwSize); BAIL_ON_NT_STATUS(ntStatus); ntStatus = NtRegGetValueA( pReg->hConnection, pReg->hKey, pReg->pszPolicyKey, pszName, RRF_RT_REG_SZ, &dwType, pszValue, &dwSize); } } if (!ntStatus && dwSize > 0) { bGotValue = TRUE; } }
NTSTATUS NtRegReadConfigDword( PLWREG_CONFIG_REG pReg, PCSTR pszName, BOOLEAN bUsePolicy, DWORD dwMin, DWORD dwMax, PDWORD pdwValue ) { NTSTATUS ntStatus = STATUS_SUCCESS; BOOLEAN bGotValue = FALSE; DWORD dwValue = 0; DWORD dwSize =0; DWORD dwType = 0; if (bUsePolicy) { if (!pReg->pszPolicyKey) { ntStatus = STATUS_INVALID_PARAMETER; BAIL_ON_NT_STATUS(ntStatus); } dwSize = sizeof(dwValue); ntStatus = NtRegGetValueA( pReg->hConnection, pReg->hKey, pReg->pszPolicyKey, pszName, RRF_RT_REG_DWORD, &dwType, (PBYTE)&dwValue, &dwSize); if (!ntStatus) { bGotValue = TRUE; } } if (!bGotValue) { dwSize = sizeof(dwValue); ntStatus = NtRegGetValueA( pReg->hConnection, pReg->hKey, pReg->pszConfigKey, pszName, RRF_RT_REG_DWORD, &dwType, (PBYTE)&dwValue, &dwSize); if (!ntStatus) { bGotValue = TRUE; } } if (bGotValue) { if (dwMin <= dwValue && dwValue <= dwMax) { *pdwValue = dwValue; } else { ntStatus = STATUS_INVALID_PARAMETER; } } cleanup: return ntStatus; error: goto cleanup; }
NTSTATUS NtRegReadConfigMultiString( PLWREG_CONFIG_REG pReg, PCSTR pszName, BOOLEAN bUsePolicy, PSTR *ppszValue, PDWORD pdwSize ) { NTSTATUS ntStatus = STATUS_SUCCESS; BOOLEAN bGotValue = FALSE; PSTR pszValue = NULL; char szValue[MAX_VALUE_LENGTH]; DWORD dwType = 0; DWORD dwSize = 0; if (bUsePolicy) { if (!pReg->pszPolicyKey) { ntStatus = STATUS_INVALID_PARAMETER; BAIL_ON_NT_STATUS(ntStatus); } dwSize = sizeof(szValue); memset(szValue, 0, dwSize); ntStatus = NtRegGetValueA( pReg->hConnection, pReg->hKey, pReg->pszPolicyKey, pszName, RRF_RT_REG_MULTI_SZ, &dwType, szValue, &dwSize); if (!ntStatus) { bGotValue = TRUE; } } if (!bGotValue ) { dwSize = sizeof(szValue); memset(szValue, 0, dwSize); ntStatus = NtRegGetValueA( pReg->hConnection, pReg->hKey, pReg->pszConfigKey, pszName, RRF_RT_REG_MULTI_SZ, &dwType, szValue, &dwSize); if (!ntStatus) { bGotValue = TRUE; } } if (bGotValue) { ntStatus = LW_RTL_ALLOCATE(&pszValue, char, dwSize); BAIL_ON_NT_STATUS(ntStatus); memcpy(pszValue, szValue, dwSize); LwRtlCStringFree(ppszValue); *ppszValue = pszValue; pszValue = NULL; if (pdwSize) { *pdwSize = dwSize; } } ntStatus = 0; cleanup: LwRtlCStringFree(&pszValue); return ntStatus; error: goto cleanup; }