2010-12-21 3 views
4

CreateFile로 파일을 만들면 파일이 만들어지고 처리됩니다.
그러나 CreateDirectory는 디렉터리의 핸들을 반환하지 않습니다.디렉터리를 만들고 하나의 IRP를 발행하여 핸들을 얻습니다.

디렉토리를 만들 때 핸들을 얻고 싶습니다.
하나의 I/O 요청 패킷 만 발행하여이 문제를 해결하고 싶습니다.

그래서 'CreateDirectory를 실행 한 다음 FILE_FLAG_BACKUP_SEMANTICS를 사용하여 CreateFile을 실행하십시오.' 대답이되지 않습니다.
두 개의 Irps를 파일 시스템에 발행합니다.

Usermode (Win32 API)에서 사용할 수있는 API가 있습니까?

답변

4

NT는이를 수행 할 수 있지만 Win32는이를 노출하지 않습니다. 이를 위해 NT API를 사용해야합니다. 특히 NtCreateFile. 그것은 ZwCreateFile의 동일한 매개 변수를 따라야합니다.

HANDLE 
CreateDirectoryAndGetHandle(PWSTR pszFileName) 
{ 
    NTSTATUS Status; 
    UNICODE_STRING FileName; 
    HANDLE DirectoryHandle; 
    IO_STATUS_BLOCK IoStatus; 
    OBJECT_ATTRIBUTES ObjectAttributes; 

    RtlInitUnicodeString(&FileName, pszFileName); 
    InitializeObjectAttributes(&ObjectAtributes, &FileName, 0, NULL, NULL); 

    Status = NtCreateFile(&DirectoryHandle, 
          GENERIC_READ | GENERIC_WRITE, 
          &ObjectAttributes, 
          &IoStatus, 
          FILE_ATTRIBUTE_NORMAL, 
          FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 
          FILE_CREATE, 
          FILE_DIRECTORY_FILE, 
          NULL, 
          0); 

    if (NT_SUCCESS(Status)) 
    { 
     return DirectoryHandle; 
    } 
    else 
    { 
     SetLastError(RtlNtStatusToDosError(Status)); 
     return INVALID_HANDLE_VALUE; 
    } 
} 

주의해야 할 몇 가지 것들 ...

  • NT 경로가 약간 다른 규칙을 가지고있다 -

    여기 (YMMV 웹 양식 내부 서둘러에서 해킹)을 예시입니다 Win32 경로보다 ... 경로를 위생해야 할 수도 있습니다.

  • HANDLE에 대해 이야기 할 때 NT API는 일반적으로 INVALID_HANDLE_VALUE이 아닌 NULL을 처리합니다.

  • 나는 여기에서하지 않았다.하지만 InitializeObjectAttributes 호출을 변경하면 다른 디렉토리 핸들과 관련된 생성 작업과 같이 흥미로운 작업을 수행 할 수있다. 물론 내가 여기에 넣은 깃발들도 바꿀 수 있습니다. 최상의 결과를 얻으려면 문서 및/또는 웹을 참조하십시오.

+1

+1 올바른 방법이지만 지치지 마십시오. [documentation mentions] (http://msdn.microsoft.com/en-us/library/bb432200.aspx)와 같이이 함수는 " Windows의 한 릴리스에서 다음 릴리스로, 경우에 따라 각 릴리스의 서비스 팩 사이에서도 변경 될 수 있습니다. " 적어도 동적 런타임 링크를 통해 변경 또는 제거 된 경우 항상 이러한 함수에 액세스해야합니다. –

+1

'CreateFile'은 실제로 디렉토리를 생성 할 수 있습니다. 처리를'CREATE_NEW'로 설정하고 플래그를'FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS | FILE_ATTRIBUTE_DIRECTORY'. 이것은 문서화되지 않았기 때문에 ReactOS와 Wine에서 구현되지 않았을 것입니다. 파이썬과 같은 스크립팅 환경에 있다면 헤더 (0x01000000)에서 올바른 값인 FILE_FLAG_POSIX_SEMANTICS를 사용해야합니다. MSDN에 나열된 값은 항상 잘못되었습니다. – eryksun

+0

NTFS의 경우'$ INDEX_ALLOCATION' 속성을 만들 수도 있습니다. 명령 프롬프트에'mkdir dirname'이라는 어리석은 버전이 있습니다 :'type nul> dirname :: $ INDEX_ALLOCATION'. 물론 FAT32 드라이브에서는 작동하지 않습니다. – eryksun

관련 문제