static NTSTATUS SetSecurity(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, PVOID FileNode0, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR SecurityDescriptor) { MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; PSECURITY_DESCRIPTOR NewSecurityDescriptor, FileSecurity; SIZE_T FileSecuritySize; NTSTATUS Result; Result = FspSetSecurityDescriptor(FileSystem, Request, FileNode->FileSecurity, &NewSecurityDescriptor); if (!NT_SUCCESS(Result)) return Result; FileSecuritySize = GetSecurityDescriptorLength(NewSecurityDescriptor); FileSecurity = (PSECURITY_DESCRIPTOR)malloc(FileSecuritySize); if (0 == FileSecurity) { FspDeleteSecurityDescriptor(NewSecurityDescriptor, (NTSTATUS (*)())FspSetSecurityDescriptor); return STATUS_INSUFFICIENT_RESOURCES; } memcpy(FileSecurity, NewSecurityDescriptor, FileSecuritySize); FspDeleteSecurityDescriptor(NewSecurityDescriptor, (NTSTATUS (*)())FspSetSecurityDescriptor); free(FileNode->FileSecurity); FileNode->FileSecuritySize = FileSecuritySize; FileNode->FileSecurity = FileSecurity; return STATUS_SUCCESS; }
static NTSTATUS perm_mode(PWSTR PermStr) { PSECURITY_DESCRIPTOR SecurityDescriptor = 0; UINT32 Uid, Gid, Mode; NTSTATUS Result; Uid = wcstoint(PermStr, &PermStr, 10); if (L':' != *PermStr) return STATUS_INVALID_PARAMETER; Gid = wcstoint(PermStr + 1, &PermStr, 10); if (L':' != *PermStr) return STATUS_INVALID_PARAMETER; Mode = wcstoint(PermStr + 1, &PermStr, 8); if (L'\0' != *PermStr) return STATUS_INVALID_PARAMETER; Result = FspPosixMapPermissionsToSecurityDescriptor(Uid, Gid, Mode, &SecurityDescriptor); if (!NT_SUCCESS(Result)) return Result; perm_print_sd(SecurityDescriptor); FspDeleteSecurityDescriptor(SecurityDescriptor, FspPosixMapPermissionsToSecurityDescriptor); return STATUS_SUCCESS; }