wibo/access.cpp

46 lines
1.6 KiB
C++

#include "access.h"
namespace wibo::access {
const GenericMapping kFileGenericMapping{FILE_GENERIC_READ, FILE_GENERIC_WRITE, FILE_GENERIC_EXECUTE, FILE_ALL_ACCESS};
const GenericMapping kDirectoryGenericMapping{
STANDARD_RIGHTS_READ | FILE_LIST_DIRECTORY | FILE_READ_ATTRIBUTES | FILE_READ_EA | FILE_TRAVERSE | SYNCHRONIZE,
STANDARD_RIGHTS_WRITE | FILE_ADD_FILE | FILE_ADD_SUBDIRECTORY | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | SYNCHRONIZE,
STANDARD_RIGHTS_EXECUTE | FILE_TRAVERSE | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
FILE_ALL_ACCESS | FILE_ADD_FILE | FILE_ADD_SUBDIRECTORY | FILE_TRAVERSE | FILE_DELETE_CHILD};
uint32_t mapGenericMask(uint32_t desiredMask, const GenericMapping &mapping) {
uint32_t mask = desiredMask;
if ((mask & GENERIC_ALL) != 0) {
mask = (mask & ~GENERIC_ALL) | mapping.genericAll;
}
if ((mask & GENERIC_READ) != 0) {
mask = (mask & ~GENERIC_READ) | mapping.genericRead;
}
if ((mask & GENERIC_WRITE) != 0) {
mask = (mask & ~GENERIC_WRITE) | mapping.genericWrite;
}
if ((mask & GENERIC_EXECUTE) != 0) {
mask = (mask & ~GENERIC_EXECUTE) | mapping.genericExecute;
}
return mask;
}
NormalizedAccess normalizeDesiredAccess(uint32_t desiredMask, const GenericMapping &mapping, uint32_t supportedMask,
uint32_t alwaysGrantMask, uint32_t defaultMask) {
NormalizedAccess out{};
uint32_t requested = mapGenericMask(desiredMask, mapping);
if (requested == 0 && desiredMask == 0 && defaultMask != 0) {
requested = defaultMask;
}
requested |= alwaysGrantMask;
out.requestedMask = requested;
out.grantedMask = requested & supportedMask;
out.deniedMask = requested & ~supportedMask;
return out;
}
} // namespace wibo::access