On Sat, May 11, 2024 at 6:17 PM Brian Inglis via Cygwin <cygwin@cygwin.com> wrote: > On 2024-05-11 05:30, Roland Mainz via Cygwin wrote: > > I'm writing a test program for |FileNormalizedNameInfo| right now (see > > https://rovema.kpaste.net/07074abc). > > Per > > https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ne-minwinbase-file_info_by_handle_class > > |FileNormalizedNameInfo| should be |24|, but on Cygwin 3.6 I get the > > value |48|. > > Since |GetFileInformationByHandleEx()| gives me error 87 (="Invalid > > Parameter") for |48|, but works as intended for |24| I assume that the > > Cygwin header is wrong. > > > > Could someone please check the Cygwin header files ? > > Could someone please read the enum constant names and classes carefully? > > Package w32api-headers: > > > Headers: > > ---- snip ---- > > $ grep -r FileNormalizedNameInfo /usr/include/ > > /usr/include/w32api/ddk/wdm.h: FileNormalizedNameInformation, > > /usr/include/w32api/minwinbase.h: *FileNormalizedNameInfo*, > > /usr/include/w32api/winternl.h: FileNormalizedNameInformation = 48, > > ---- snip ---- > > *FileNormalizedNameInfo* 24/0x18 is defined in minwinbase.h > FILE_INFO_BY_HANDLE_CLASS for GetFileInformationByHandleEx whereas > *FileNormalizedNameInformation* 44/0x2e is defined in winternl.h > FILE_INFORMATION_CLASS for NtQueryInformationFile: > > https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntqueryinformationfile > > ditto in ddk/wdm.h!
Something is still wrong on my side, with Cygwin 3.6 on Windows 10: Example: ---- snip ---- #define UNICODE 1 #define _UNICODE 1 #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <stdbool.h> int main(int ac, char *av[]) { (void)printf("FileNormalizedNameInfo=%d/0x%x\n", (int)FileNormalizedNameInfo, (int)FileNormalizedNameInfo); return EXIT_SUCCESS; } ---- snip ---- Compiling this with $ gcc -Wall test4.c -o test4 # and running it returns this: ---- snip ---- $ ./test4 FileNormalizedNameInfo=22/0x16 ---- snip ---- The expected output would be "FileNormalizedNameInfo=24/0x18", because in https://learn.microsoft.com/de-de/windows/win32/api/minwinbase/ne-minwinbase-file_info_by_handle_class |FileNormalizedNameInfo| is in position 24. Looking at /usr/include/w32api/minwinbase.h: ---- snip ---- typedef enum _FILE_INFO_BY_HANDLE_CLASS { FileBasicInfo /* is zero? */, FileStandardInfo, FileNameInfo, FileRenameInfo, FileDispositionInfo, FileAllocationInfo, FileEndOfFileInfo, FileStreamInfo, FileCompressionInfo, FileAttributeTagInfo, FileIdBothDirectoryInfo, FileIdBothDirectoryRestartInfo, FileIoPriorityHintInfo, FileRemoteProtocolInfo, FileFullDirectoryInfo, FileFullDirectoryRestartInfo, #if _WIN32_WINNT >= 0x0602 FileStorageInfo, FileAlignmentInfo, FileIdInfo, FileIdExtdDirectoryInfo, FileIdExtdDirectoryRestartInfo, #endif #if _WIN32_WINNT >= 0x0A000002 FileDispositionInfoEx, FileRenameInfoEx, #endif FileCaseSensitiveInfo, FileNormalizedNameInfo, MaximumFileInfoByHandleClass } FILE_INFO_BY_HANDLE_CLASS, *PFILE_INFO_BY_HANDLE_CLASS; #endif ---- snip ---- This code cannot work, because the integer value for |FileNormalizedNameInfo| enum shift with different Windows versions, e.g. |FileNormalizedNameInfo| has value |22| if |_WIN32_WINNT==0x0602| but value |24| if |_WIN32_WINNT==0x0A000002|. I filed https://github.com/mingw-w64/mingw-w64/issues/48 for the issue, but it would be nice if this can be fixed in both Cygwin 3.5 and 3.6... ---- Bye, Roland -- __ . . __ (o.\ \/ /.o) roland.ma...@nrubsig.org \__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer /O /==\ O\ TEL +49 641 3992797 (;O/ \/ \O;) -- Problem reports: https://cygwin.com/problems.html FAQ: https://cygwin.com/faq/ Documentation: https://cygwin.com/docs.html Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple