/*++ Copyright (c) 1996 Microsoft Corporation Module Name: strsd.c Abstract: This Module implements wrapper functions to convert from a specialized string representation of a security descriptor to the security descriptor itself, and the opposite function. Author: Environment: User Mode Revision History: --*/ #include "headers.h" //#include //#include //#include //#include #include "sddl.h" #pragma hdrstop DWORD ScepGetSecurityInformation( IN PSECURITY_DESCRIPTOR pSD, OUT SECURITY_INFORMATION *pSeInfo ); DWORD WINAPI ConvertTextSecurityDescriptor ( IN PWSTR pwszTextSD, OUT PSECURITY_DESCRIPTOR *ppSD, OUT PULONG pcSDSize OPTIONAL, OUT PSECURITY_INFORMATION pSeInfo OPTIONAL ) { DWORD rc=ERROR_SUCCESS; if ( NULL == pwszTextSD || NULL == ppSD ) { return(ERROR_INVALID_PARAMETER); } // // initialize output buffers // *ppSD = NULL; if ( pSeInfo ) { *pSeInfo = 0; } if ( pcSDSize ) { *pcSDSize = 0; } // // call SDDL convert apis // if ( ConvertStringSecurityDescriptorToSecurityDescriptorW( pwszTextSD, SDDL_REVISION_1, ppSD, pcSDSize ) ) { // // conversion succeeds // if ( pSeInfo && *ppSD ) { // // get the SeInfo // rc = ScepGetSecurityInformation( *ppSD, pSeInfo ); if ( rc != ERROR_SUCCESS ) { LocalFree(*ppSD); *ppSD = NULL; if ( pcSDSize ) { *pcSDSize = 0; } } } } else { rc = GetLastError(); } return(rc); } DWORD WINAPI ConvertSecurityDescriptorToText ( IN PSECURITY_DESCRIPTOR pSD, IN SECURITY_INFORMATION SecurityInfo, OUT PWSTR *ppwszTextSD, OUT PULONG pcTextSize ) { if ( ConvertSecurityDescriptorToStringSecurityDescriptorW( pSD, SDDL_REVISION_1, SecurityInfo, ppwszTextSD, pcTextSize ) ) { return(ERROR_SUCCESS); } else { return(GetLastError()); } } DWORD ScepGetSecurityInformation( IN PSECURITY_DESCRIPTOR pSD, OUT SECURITY_INFORMATION *pSeInfo ) { PSID Owner = NULL, Group = NULL; BOOLEAN Defaulted; NTSTATUS Status; SECURITY_DESCRIPTOR_CONTROL ControlCode=0; ULONG Revision; if ( !pSeInfo ) { return(ERROR_INVALID_PARAMETER); } *pSeInfo = 0; if ( !pSD ) { return(ERROR_SUCCESS); } Status = RtlGetOwnerSecurityDescriptor( pSD, &Owner, &Defaulted ); if ( NT_SUCCESS( Status ) ) { if ( Owner && !Defaulted ) { *pSeInfo |= OWNER_SECURITY_INFORMATION; } Status = RtlGetGroupSecurityDescriptor( pSD, &Group, &Defaulted ); } if ( NT_SUCCESS( Status ) ) { if ( Group && !Defaulted ) { *pSeInfo |= GROUP_SECURITY_INFORMATION; } Status = RtlGetControlSecurityDescriptor ( pSD, &ControlCode, &Revision); } if ( NT_SUCCESS( Status ) ) { if ( ControlCode & SE_DACL_PRESENT ) { *pSeInfo |= DACL_SECURITY_INFORMATION; } if ( ControlCode & SE_SACL_PRESENT ) { *pSeInfo |= SACL_SECURITY_INFORMATION; } } else { *pSeInfo = 0; } return( RtlNtStatusToDosError(Status) ); }