Source code of Windows XP (NT5)
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.

85 lines
2.2 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. //SeEnableAccessToExports();
  19. length = sizeof(ACL) + 2*sizeof(ACCESS_ALLOWED_ACE) +
  20. RtlLengthSid(SeExports->SeLocalSystemSid) +
  21. RtlLengthSid(SeExports->SeAliasAdminsSid) +
  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, GENERIC_ALL,
  33. SeExports->SeLocalSystemSid);
  34. if (!NT_SUCCESS(status)) {
  35. ExFreePool(acl);
  36. return status;
  37. }
  38. status = RtlAddAccessAllowedAce(acl, ACL_REVISION2, GENERIC_READ |
  39. GENERIC_WRITE | GENERIC_EXECUTE |
  40. READ_CONTROL, SeExports->SeAliasAdminsSid);
  41. if (!NT_SUCCESS(status)) {
  42. ExFreePool(acl);
  43. return status;
  44. }
  45. status = RtlCreateSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
  46. if (!NT_SUCCESS(status)) {
  47. ExFreePool(acl);
  48. return status;
  49. }
  50. status = RtlSetDaclSecurityDescriptor(&sd, TRUE, acl, FALSE);
  51. if (!NT_SUCCESS(status)) {
  52. ExFreePool(acl);
  53. return status;
  54. }
  55. InitializeObjectAttributes(&oa, PartitionName, OBJ_CASE_INSENSITIVE, NULL,
  56. NULL);
  57. status = ZwOpenFile(&h, WRITE_DAC, &oa, &ioStatus, FILE_SHARE_READ |
  58. FILE_SHARE_WRITE | FILE_SHARE_DELETE,
  59. FILE_SYNCHRONOUS_IO_ALERT);
  60. if (!NT_SUCCESS(status)) {
  61. ExFreePool(acl);
  62. return status;
  63. }
  64. status = ZwSetSecurityObject(h, DACL_SECURITY_INFORMATION, &sd);
  65. ZwClose(h);
  66. ExFreePool(acl);
  67. return status;
  68. }