static int OnNtQueryAttributesFile(HWND hDlg) { FILE_BASIC_INFORMATION BasicInfo; OBJECT_ATTRIBUTES ObjAttr; TFileTestData * pData = GetDialogData(hDlg); UNICODE_STRING FileName = {0, 0, NULL}; NTSTATUS Status; TCHAR szMsgText[512] = _T(""); // Save the current state of the dialog SaveDialog(hDlg); // Retrieve the NT name of the file InitializeObjectAttributes(&ObjAttr, &FileName, OBJ_CASE_INSENSITIVE, NULL, NULL); Status = FileNameToUnicodeString(&FileName, pData->szFileName1); // Query the attributes if(NT_SUCCESS(Status)) { Status = NtQueryAttributesFile(&ObjAttr, &BasicInfo); if(NT_SUCCESS(Status)) { StringCchPrintf(szMsgText, _countof(szMsgText), _T("CreationTime: %08X-%08X\n") _T("LastAccessTime: %08X-%08X\n") _T("LastWriteTime: %08X-%08X\n") _T("ChangeTime: %08X-%08X\n") _T("FileAttributes: %08X"), BasicInfo.CreationTime.HighPart, BasicInfo.CreationTime.LowPart, BasicInfo.LastAccessTime.HighPart, BasicInfo.LastAccessTime.LowPart, BasicInfo.LastWriteTime.HighPart, BasicInfo.LastWriteTime.LowPart, BasicInfo.ChangeTime.HighPart, BasicInfo.ChangeTime.LowPart, BasicInfo.FileAttributes); MessageBoxRc(hDlg, IDS_FILE_BASIC_INFORMATION, (UINT_PTR)szMsgText); } } // Set the result information SetResultInfo(hDlg, Status); FreeFileNameString(&FileName); return TRUE; }
DWORD APIENTRY GetFileAttributesW( LPCWSTR lpFileName ) /*++ Routine Description: The attributes of a file can be obtained using GetFileAttributes. This API provides the same functionality as DOS (int 21h, function 43H with AL=0), and provides a subset of OS/2's DosQueryFileInfo. Arguments: lpFileName - Supplies the file name of the file whose attributes are to be set. Return Value: Not -1 - Returns the attributes of the specified file. Valid returned attributes are: FILE_ATTRIBUTE_NORMAL - The file is a normal file. FILE_ATTRIBUTE_READONLY - The file is marked read-only. FILE_ATTRIBUTE_HIDDEN - The file is marked as hidden. FILE_ATTRIBUTE_SYSTEM - The file is marked as a system file. FILE_ATTRIBUTE_ARCHIVE - The file is marked for archive. FILE_ATTRIBUTE_DIRECTORY - The file is marked as a directory. FILE_ATTRIBUTE_VOLUME_LABEL - The file is marked as a volume lable. 0xffffffff - The operation failed. Extended error status is available using GetLastError. --*/ { NTSTATUS Status; OBJECT_ATTRIBUTES Obja; UNICODE_STRING FileName; FILE_BASIC_INFORMATION BasicInfo; BOOLEAN TranslationStatus; RTL_RELATIVE_NAME RelativeName; PVOID FreeBuffer; TranslationStatus = RtlDosPathNameToNtPathName_U( lpFileName, &FileName, NULL, &RelativeName ); if ( !TranslationStatus ) { SetLastError(ERROR_PATH_NOT_FOUND); return (DWORD)-1; } FreeBuffer = FileName.Buffer; if ( RelativeName.RelativeName.Length ) { FileName = *(PUNICODE_STRING)&RelativeName.RelativeName; } else { RelativeName.ContainingDirectory = NULL; } InitializeObjectAttributes( &Obja, &FileName, OBJ_CASE_INSENSITIVE, RelativeName.ContainingDirectory, NULL ); // // Open the file // Status = NtQueryAttributesFile( &Obja, &BasicInfo ); RtlFreeHeap(RtlProcessHeap(), 0, FreeBuffer); if ( NT_SUCCESS(Status) ) { return BasicInfo.FileAttributes; } else { // // Check for a device name. // if ( RtlIsDosDeviceName_U((PWSTR)lpFileName) ) { return FILE_ATTRIBUTE_ARCHIVE; } BaseSetLastNTError(Status); return (DWORD)-1; } }