Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
2.6 KiB

  1. extern "C" {
  2. #include <ntosp.h>
  3. #include <zwapi.h>
  4. }
  5. #include <ftdisk.h>
  6. NTSTATUS
  7. FtpApplyESPProtection(
  8. IN PUNICODE_STRING PartitionName
  9. )
  10. {
  11. ULONG length;
  12. PACL acl;
  13. NTSTATUS status;
  14. SECURITY_DESCRIPTOR sd;
  15. OBJECT_ATTRIBUTES oa;
  16. HANDLE h;
  17. IO_STATUS_BLOCK ioStatus;
  18. length = sizeof(ACL) + 3*sizeof(ACCESS_ALLOWED_ACE) +
  19. RtlLengthSid(SeExports->SeLocalSystemSid) +
  20. RtlLengthSid(SeExports->SeAliasAdminsSid) +
  21. RtlLengthSid(SeExports->SeWorldSid) +
  22. 8; // The 8 is just for good measure.
  23. acl = (PACL) ExAllocatePool(PagedPool, length);
  24. if (!acl) {
  25. return STATUS_INSUFFICIENT_RESOURCES;
  26. }
  27. status = RtlCreateAcl(acl, length, ACL_REVISION2);
  28. if (!NT_SUCCESS(status)) {
  29. ExFreePool(acl);
  30. return status;
  31. }
  32. status = RtlAddAccessAllowedAce(acl, ACL_REVISION2, FILE_READ_ATTRIBUTES |
  33. SYNCHRONIZE | READ_CONTROL,
  34. SeExports->SeWorldSid);
  35. if (!NT_SUCCESS(status)) {
  36. ExFreePool(acl);
  37. return status;
  38. }
  39. status = RtlAddAccessAllowedAce(acl, ACL_REVISION2, GENERIC_ALL,
  40. SeExports->SeLocalSystemSid);
  41. if (!NT_SUCCESS(status)) {
  42. ExFreePool(acl);
  43. return status;
  44. }
  45. status = RtlAddAccessAllowedAce(acl, ACL_REVISION2, GENERIC_READ |
  46. GENERIC_WRITE | GENERIC_EXECUTE |
  47. READ_CONTROL, SeExports->SeAliasAdminsSid);
  48. if (!NT_SUCCESS(status)) {
  49. ExFreePool(acl);
  50. return status;
  51. }
  52. status = RtlCreateSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
  53. if (!NT_SUCCESS(status)) {
  54. ExFreePool(acl);
  55. return status;
  56. }
  57. status = RtlSetDaclSecurityDescriptor(&sd, TRUE, acl, FALSE);
  58. if (!NT_SUCCESS(status)) {
  59. ExFreePool(acl);
  60. return status;
  61. }
  62. InitializeObjectAttributes(&oa, PartitionName, OBJ_CASE_INSENSITIVE |
  63. OBJ_KERNEL_HANDLE, NULL, NULL);
  64. status = ZwOpenFile(&h, WRITE_DAC, &oa, &ioStatus, FILE_SHARE_READ |
  65. FILE_SHARE_WRITE | FILE_SHARE_DELETE,
  66. FILE_SYNCHRONOUS_IO_ALERT);
  67. if (!NT_SUCCESS(status)) {
  68. ExFreePool(acl);
  69. return status;
  70. }
  71. status = ZwSetSecurityObject(h, DACL_SECURITY_INFORMATION, &sd);
  72. ZwClose(h);
  73. ExFreePool(acl);
  74. return status;
  75. }