在DDK里,哪个函数可以修改文件的属性

198409098   2007-9-30 15:53 楼主
在DDK里,哪个函数可以修改文件的属性

回复评论 (6)

NtSetInformationFile
点赞  2007-10-6 10:18
Usermode: SetFileAttribute
Kernelmode: ZwSetInformationFile
点赞  2007-10-9 10:14
告诉楼主一下,正常来说,在usermode下使用的API,在kernelmode下,加上前缀Zw即可.
点赞  2007-10-9 16:22
我是新手,能给个例子吗
点赞  2007-10-9 17:36
设置成只读的
点赞  2007-10-9 17:45
借花献佛,给你贴上一个ReactOS的SetFileAttributesW实现。
  1. BOOL STDCALL
  2. SetFileAttributesW(LPCWSTR lpFileName,
  3.                    DWORD dwFileAttributes)
  4. {
  5.   FILE_BASIC_INFORMATION FileInformation;
  6.   OBJECT_ATTRIBUTES ObjectAttributes;
  7.   IO_STATUS_BLOCK IoStatusBlock;
  8.   UNICODE_STRING FileName;
  9.   HANDLE FileHandle;
  10.   NTSTATUS Status;

  11.   DPRINT ("SetFileAttributeW(%S, 0x%lx) called\n", lpFileName, dwFileAttributes);

  12.   /* Validate and translate the filename */
  13.   if (!RtlDosPathNameToNtPathName_U (lpFileName,
  14.                                      &FileName,
  15.                                      NULL,
  16.                                      NULL))
  17.     {
  18.       DPRINT ("Invalid path\n");
  19.       SetLastError (ERROR_BAD_PATHNAME);
  20.       return FALSE;
  21.     }
  22.   DPRINT ("FileName: \'%wZ\'\n", &FileName);

  23.   /* build the object attributes */
  24.   InitializeObjectAttributes (&ObjectAttributes,
  25.                               &FileName,
  26.                               OBJ_CASE_INSENSITIVE,
  27.                               NULL,
  28.                               NULL);

  29.   /* Open the file */
  30.   Status = NtOpenFile (&FileHandle,
  31.                        SYNCHRONIZE | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
  32.                        &ObjectAttributes,
  33.                        &IoStatusBlock,
  34.                        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
  35.                        FILE_SYNCHRONOUS_IO_NONALERT);
  36.   RtlFreeUnicodeString (&FileName);
  37.   if (!NT_SUCCESS (Status))
  38.     {
  39.       DPRINT ("NtOpenFile() failed (Status %lx)\n", Status);
  40.       SetLastErrorByStatus (Status);
  41.       return FALSE;
  42.     }

  43.   Status = NtQueryInformationFile(FileHandle,
  44.                                   &IoStatusBlock,
  45.                                   &FileInformation,
  46.                                   sizeof(FILE_BASIC_INFORMATION),
  47.                                   FileBasicInformation);
  48.   if (!NT_SUCCESS(Status))
  49.     {
  50.       DPRINT ("SetFileAttributes NtQueryInformationFile failed with status 0x%08x\n", Status);
  51.       NtClose (FileHandle);
  52.       SetLastErrorByStatus (Status);
  53.       return FALSE;
  54.     }

  55.   FileInformation.FileAttributes = dwFileAttributes;
  56.   Status = NtSetInformationFile(FileHandle,
  57.                                 &IoStatusBlock,
  58.                                 &FileInformation,
  59.                                 sizeof(FILE_BASIC_INFORMATION),
  60.                                 FileBasicInformation);
  61.   NtClose (FileHandle);
  62.   if (!NT_SUCCESS(Status))
  63.     {
  64.       DPRINT ("SetFileAttributes NtSetInformationFile failed with status 0x%08x\n", Status);
  65.       SetLastErrorByStatus (Status);
  66.       return FALSE;
  67.     }

  68.   return TRUE;
  69. }
点赞  2007-10-9 17:59
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复