Beispiel #1
0
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;
}
Beispiel #2
0
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;
}