86 lines
2.2 KiB
C++
86 lines
2.2 KiB
C++
|
extern "C" {
|
|||
|
#include <ntosp.h>
|
|||
|
#include <zwapi.h>
|
|||
|
}
|
|||
|
|
|||
|
#include <ftdisk.h>
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
FtpApplyESPProtection(
|
|||
|
IN PUNICODE_STRING PartitionName
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
ULONG length;
|
|||
|
PACL acl;
|
|||
|
NTSTATUS status;
|
|||
|
SECURITY_DESCRIPTOR sd;
|
|||
|
OBJECT_ATTRIBUTES oa;
|
|||
|
HANDLE h;
|
|||
|
IO_STATUS_BLOCK ioStatus;
|
|||
|
|
|||
|
//SeEnableAccessToExports();
|
|||
|
|
|||
|
length = sizeof(ACL) + 2*sizeof(ACCESS_ALLOWED_ACE) +
|
|||
|
RtlLengthSid(SeExports->SeLocalSystemSid) +
|
|||
|
RtlLengthSid(SeExports->SeAliasAdminsSid) +
|
|||
|
8; // The 8 is just for good measure.
|
|||
|
|
|||
|
acl = (PACL) ExAllocatePool(PagedPool, length);
|
|||
|
if (!acl) {
|
|||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
|||
|
}
|
|||
|
|
|||
|
status = RtlCreateAcl(acl, length, ACL_REVISION2);
|
|||
|
if (!NT_SUCCESS(status)) {
|
|||
|
ExFreePool(acl);
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
status = RtlAddAccessAllowedAce(acl, ACL_REVISION2, GENERIC_ALL,
|
|||
|
SeExports->SeLocalSystemSid);
|
|||
|
if (!NT_SUCCESS(status)) {
|
|||
|
ExFreePool(acl);
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
status = RtlAddAccessAllowedAce(acl, ACL_REVISION2, GENERIC_READ |
|
|||
|
GENERIC_WRITE | GENERIC_EXECUTE |
|
|||
|
READ_CONTROL, SeExports->SeAliasAdminsSid);
|
|||
|
if (!NT_SUCCESS(status)) {
|
|||
|
ExFreePool(acl);
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
status = RtlCreateSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
|
|||
|
if (!NT_SUCCESS(status)) {
|
|||
|
ExFreePool(acl);
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
status = RtlSetDaclSecurityDescriptor(&sd, TRUE, acl, FALSE);
|
|||
|
if (!NT_SUCCESS(status)) {
|
|||
|
ExFreePool(acl);
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
InitializeObjectAttributes(&oa, PartitionName, OBJ_CASE_INSENSITIVE, NULL,
|
|||
|
NULL);
|
|||
|
|
|||
|
status = ZwOpenFile(&h, WRITE_DAC, &oa, &ioStatus, FILE_SHARE_READ |
|
|||
|
FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
|||
|
FILE_SYNCHRONOUS_IO_ALERT);
|
|||
|
if (!NT_SUCCESS(status)) {
|
|||
|
ExFreePool(acl);
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
status = ZwSetSecurityObject(h, DACL_SECURITY_INFORMATION, &sd);
|
|||
|
|
|||
|
ZwClose(h);
|
|||
|
ExFreePool(acl);
|
|||
|
|
|||
|
return status;
|
|||
|
}
|