#include #include #include #include #include #include #include int _cdecl main(int argc, char * argv[]) { NTSTATUS status; OBJECT_ATTRIBUTES objectAttributes; WCHAR unicodeName[MAX_PATH]; UCHAR SecurityDescriptorBuffer[512]; UNICODE_STRING nameString; IO_STATUS_BLOCK ioStatusBlock; ULONG lengthNeeded; HANDLE fileHandle; if (argc < 2) { printf("usage: %s file\n", argv[0]); return -1; } mbstowcs(unicodeName, argv[1], strlen(argv[1]) + 1); RtlDosPathNameToNtPathName_U( unicodeName, &nameString, NULL, NULL); InitializeObjectAttributes( &objectAttributes, &nameString, OBJ_CASE_INSENSITIVE, NULL, NULL); status = NtOpenFile( &fileHandle, READ_CONTROL | WRITE_DAC, &objectAttributes, &ioStatusBlock, FILE_SHARE_READ | FILE_SHARE_WRITE, 0); if (!NT_SUCCESS(status) || !NT_SUCCESS(ioStatusBlock.Status)) { printf("%s: NtOpenFile on %wZ failed %lx %lx\n", argv[0], &nameString, status, ioStatusBlock.Status); return -1; } // // Now read the DACL from the server file. // status = NtQuerySecurityObject( fileHandle, DACL_SECURITY_INFORMATION, (PSECURITY_DESCRIPTOR)SecurityDescriptorBuffer, sizeof(SecurityDescriptorBuffer), &lengthNeeded); if (!NT_SUCCESS(status)) { printf("%s: NtQuerySecurityObject on %wZ failed %lx %lx\n", argv[0], &nameString, status, lengthNeeded); return -1; } #if 0 status = RtlSetDaclSecurityDescriptor( (PSECURITY_DESCRIPTOR)SecurityDescriptorBuffer, FALSE, NULL, FALSE); if (!NT_SUCCESS(status)) { printf("%s: RtlSetDaclSecurityDescriptor on %wZ failed %lx\n", argv[0], &nameString, status); return -1; } #else ((PISECURITY_DESCRIPTOR)SecurityDescriptorBuffer)->Control &= ~SE_DACL_PRESENT; #endif status = NtSetSecurityObject( fileHandle, DACL_SECURITY_INFORMATION, (PSECURITY_DESCRIPTOR)SecurityDescriptorBuffer); if (!NT_SUCCESS(status)) { printf("%s: NtSetSecurityObject on %wZ failed %lx %lx\n", argv[0], &nameString, status); return -1; } printf("%s: DACL successfully cleared on %wZ\n", argv[0], &nameString); return 0; }