145#ifdef INCLUDE_CMD_DIR
242 return ( pszPath[0] ==
_T(
'.') &&
244 (pszPath[1] ==
_T(
'.') && (pszPath[2] == 0 ))
254 return ((
Length == 1 && pPath[0] ==
_T(
'.')) ||
255 (
Length == 2 && pPath[0] ==
_T(
'.') && pPath[1] ==
_T(
'.')));
285 cCurSwitch =
_T(
' ');
292 bOrderByNoPar =
FALSE;
304 if (cCurSwitch ==
_T(
'/'))
309 bNegative = (*
Line ==
_T(
'-'));
315 if ((cCurUChar ==
_T(
'A')) ||(cCurUChar ==
_T(
'T')) || (cCurUChar ==
_T(
'O')))
331 bOrderByNoPar = !bNegative;
339 cCurSwitch = cCurUChar;
347 else if (cCurUChar ==
_T(
'L'))
349 else if (cCurUChar ==
_T(
'B'))
351 else if (cCurUChar ==
_T(
'C'))
353 else if (cCurUChar ==
_T(
'W'))
355 else if (cCurUChar ==
_T(
'D'))
357 else if (cCurUChar ==
_T(
'N'))
359 else if (cCurUChar ==
_T(
'P'))
360 lpFlags->
bPause = ! bNegative;
361 else if (cCurUChar ==
_T(
'Q'))
362 lpFlags->
bUser = ! bNegative;
363 else if (cCurUChar ==
_T(
'S'))
365 else if (cCurUChar ==
_T(
'X'))
367 else if (cCurUChar ==
_T(
'R'))
369 else if (cCurChar ==
_T(
'4'))
370 lpFlags->
b4Digit = ! bNegative;
371 else if (cCurChar ==
_T(
'?'))
389 cCurSwitch =
_T(
' ');
391 else if (cCurSwitch ==
_T(
' '))
396 if (cCurChar ==
_T(
'/'))
397 cCurSwitch =
_T(
'/');
409 bIntoQuotes ^= (*
Line ==
_T(
'"'));
419 temp[ptrEnd - ptrStart] =
_T(
'\0');
441 cCurSwitch =
_T(
' ');
448 if (cCurChar ==
_T(
'-'))
450 else if (cCurUChar ==
_T(
'D'))
454 lpFlags->
stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_DIRECTORY;
458 else if (cCurUChar ==
_T(
'R'))
462 lpFlags->
stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_READONLY;
466 else if (cCurUChar ==
_T(
'H'))
470 lpFlags->
stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_HIDDEN;
474 else if (cCurUChar ==
_T(
'A'))
478 lpFlags->
stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_ARCHIVE;
482 else if (cCurUChar ==
_T(
'S'))
486 lpFlags->
stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_SYSTEM;
497 if (cCurUChar ==
_T(
'C'))
499 else if (cCurUChar ==
_T(
'A'))
501 else if (cCurUChar ==
_T(
'W'))
511 bOrderByNoPar =
FALSE;
513 if (cCurChar ==
_T(
'-'))
515 else if (cCurUChar ==
_T(
'N'))
521 else if (cCurUChar ==
_T(
'S'))
527 else if (cCurUChar ==
_T(
'G'))
533 else if (cCurUChar ==
_T(
'E'))
539 else if (cCurUChar ==
_T(
'D'))
555 if ((cCurChar !=
_T(
'-')) && bPNegative)
619 if (szVolName[0] !=
_T(
'\0'))
743 "GetDiskFreeSpaceExW");
745 "GetDiskFreeSpaceExA");
747 if (pGetFreeDiskSpaceEx !=
NULL)
749 if (pGetFreeDiskSpaceEx(lpRoot, lpFreeSpace, &TotalNumberOfBytes, &TotalNumberOfFreeBytes) !=
FALSE)
760 lpFreeSpace->
QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl;
782 if (!(ulFiles + ulDirs))
800 DirPrintf(lpFlags, szMsg, ulFiles, szBuffer);
809 DirPrintf(lpFlags, szMsg, ulFiles, szBuffer);
818 DirPrintf(lpFlags, szMsg, ulDirs, szBuffer);
833 return (lastdot !=
NULL ? lastdot + 1 : NoExt);
861 *(
dest + iLen) =
_T(
'\0');
880 TCHAR szShortName[15];
912 szShortName[0] =
_T(
'\0');
914 _stprintf(szShortName,
_T(
" %-12s"), ptrFiles[
i]->stFindInfo.cAlternateFileName);
926 ptrFiles[
i]->stFindInfo.cFileName);
929 ptrCurStream = ptrFiles[
i]->
ptrHead;
941 ptrFiles[
i]->stFindInfo.cFileName,
943 ptrCurStream = ptrCurStream->
ptrNext;
971 for (
i = 0;
i < dwCount;
i++)
976 if ((
_tcslen(ptrFiles[
i]->stFindInfo.cFileName) + 2) > iLongestName)
977 iLongestName =
_tcslen(ptrFiles[
i]->stFindInfo.cFileName) + 2;
981 if (
_tcslen(ptrFiles[
i]->stFindInfo.cFileName) > iLongestName)
982 iLongestName =
_tcslen(ptrFiles[
i]->stFindInfo.cFileName);
988 iColumns = (
USHORT)(iScreenWidth / iLongestName);
991 if (((iLongestName * iColumns) + iColumns) >= (
UINT)iScreenWidth)
995 if (!iColumns) iColumns = 1;
998 iLines = (
USHORT)((dwCount + iColumns - 1) / iColumns);
1002 for (
j = 0;
j < iColumns;
j++)
1012 temp = (
i * iColumns) +
j;
1015 if (
temp >= dwCount)
break;
1018 _stprintf(szTempFname,
_T(
"[%s]"), ptrFiles[
temp]->stFindInfo.cFileName);
1020 _stprintf(szTempFname,
_T(
"%s"), ptrFiles[
temp]->stFindInfo.cFileName);
1022 DirPrintf(lpFlags,
_T(
"%-*s"), iLongestName + 1, szTempFname);
1053 if (*ptrFiles[
i]->stFindInfo.cAlternateFileName )
1057 _tcscpy(szExt,
getExt( ptrFiles[
i]->stFindInfo.cAlternateFileName));
1119 DirPrintf(lpFlags,
_T(
"%s\\%s\n"), szCurPath, ptrFiles[
i]->stFindInfo.cFileName);
1124 DirPrintf(lpFlags,
_T(
"%s\n"), ptrFiles[
i]->stFindInfo.cFileName);
1146 if (
_tcslen(szTemp) == 2 && szTemp[1] ==
_T(
':'))
1202 for (
i = 0;
i < lpFlags->
stOrderBy.sCriteriaCount;
i++)
1280 if (iComp != 0)
break;
1303 int First =
i, Last =
j, Temp;
1310 lpTemp = ptrArray[
i];
1311 ptrArray[
i]= ptrArray[
j];
1312 ptrArray[
j] = lpTemp;
1336 while (ptrStartNode)
1338 ptrNextNode = ptrStartNode->
ptrNext;
1346 ptrStartNode = ptrNextNode;
1376 WIN32_FIND_STREAM_DATA wfsdStreamInfo;
1382 ptrStartNode =
NULL;
1391 if (ptrStartNode ==
NULL)
1393 WARN(
"Cannot allocate memory for ptrStartNode!\n");
1397 ptrNextNode = ptrStartNode;
1405 if ((wfdFileInfo.dwFileAttributes & lpFlags->
stAttribs.dwAttribMask) ==
1411 WARN(
"Cannot allocate memory for ptrNextNode->ptrNext!\n");
1425 _tcslwr(ptrNextNode->
ptrNext->stInfo.stFindInfo.cAlternateFileName);
1435 if (!pFindFirstStreamW)
1442 if (pFindFirstStreamW && pFindNextStreamW)
1444 hStreams = pFindFirstStreamW(wfdFileInfo.cFileName, FindStreamInfoStandard, &wfsdStreamInfo, 0);
1449 ERR(
"FindFirstStreamW not supported!\n");
1455 ptrCurNode = &ptrNextNode->
ptrNext->stInfo.ptrHead;
1456 while (pFindNextStreamW(hStreams, &wfsdStreamInfo))
1459 if (*ptrCurNode ==
NULL)
1461 WARN(
"Cannot allocate memory for *ptrCurNode!\n");
1468 memcpy(&(*ptrCurNode)->stStreamInfo, &wfsdStreamInfo,
1469 sizeof(WIN32_FIND_STREAM_DATA));
1474 _tcslwr((*ptrCurNode)->stStreamInfo.cStreamName);
1477 ptrCurNode = &(*ptrCurNode)->
ptrNext;
1486 ptrNextNode = ptrNextNode->
ptrNext;
1499 u64Temp.
HighPart = wfdFileInfo.nFileSizeHigh;
1500 u64Temp.
LowPart = wfdFileInfo.nFileSizeLow;
1513 if (ptrFileArray ==
NULL)
1515 WARN(
"Cannot allocate memory for ptrFileArray!\n");
1524 ptrNextNode = ptrStartNode;
1528 ptrFileArray[dwCount] = &ptrNextNode->
ptrNext->stInfo;
1529 ptrNextNode = ptrNextNode->
ptrNext;
1534 if (lpFlags->
stOrderBy.sCriteriaCount > 0)
1535 QsortFiles(ptrFileArray, 0, dwCount-1, lpFlags);
1538 cPathSep = pszFilePart[-1];
1539 pszFilePart[-1] =
_T(
'\0');
1551 pszFilePart[-1] = cPathSep;
1575 memcpy(szSubPath, szFullPath, (pszFilePart - szFullPath) *
sizeof(
TCHAR));
1576 _tcscpy(&szSubPath[pszFilePart - szFullPath],
_T(
"*.*"));
1588 memcpy(szSubPath, szFullPath, (pszFilePart - szFullPath) *
sizeof(
TCHAR));
1589 _tcscpy(&szSubPath[pszFilePart - szFullPath], wfdFileInfo.cFileName);
1591 pszSubFilePart = &szSubPath[
_tcslen(szSubPath)];
1592 _tcscat(pszSubFilePart, pszFilePart);
1595 if (
DirList(szSubPath, pszSubFilePart, lpFlags) != 0)
1651 _tcscpy(szNewPattern, pszPattern);
1652 pszPattern = szNewPattern;
1654 TRACE(
"Original pszPattern: %S\n", pszPattern);
1657 pNextDir = pszPattern;
1658 while ((pNextDir =
_tcschr(pNextDir,
_T(
'/'))))
1659 *pNextDir++ =
_T(
'\\');
1671 pNextDir = pszPattern;
1682 if ((pNextDir - pCurDir == 0) ||
IsDotDirectoryN(pCurDir, pNextDir - pCurDir))
1690 for (
ptr = pCurDir;
ptr < pNextDir; ++
ptr)
1692 if (*
ptr !=
_T(
'.'))
1708 if (
ptr[0] ==
_T(
'.') && (
ptr[1] ==
_T(
'\\') ||
ptr[1] == 0))
1713 else if (
ptr[0] ==
_T(
'.') &&
ptr[1] ==
_T(
'.') && (
ptr[2] ==
_T(
'\\') ||
ptr[2] == 0))
1735 TRACE(
"New pszPattern: %S\n", pszPattern);
1740 _tcscpy(pszFullPath, pszPattern);
1741 pszPatternPart =
NULL;
1744 TRACE(
"pszFullPath (1): %S\n", pszFullPath);
1745 TRACE(
"pszPatternPart (1): %S\n", pszPatternPart);
1762 pNextDir = pszPattern;
1773 if (
_istalpha(pNextDir[0]) && pNextDir[1] ==
_T(
':') && pNextDir[2] !=
_T(
'\\'))
1780 else if (pszPatternPart ==
NULL)
1787 pszPatternPart = &pszFullPath[
_tcslen(pszFullPath)];
1788 _tcscpy(pszPatternPart, pNextDir);
1789 pszPatternPart =
NULL;
1792 else if (
_tcscmp(pNextDir, pszPatternPart) != 0)
1799 TRACE(
"pszPatternPart: %S is DIFFERENT from file criterion: %S\n", pszPatternPart, pNextDir);
1805 _tcscpy(pszPatternPart, pNextDir);
1809 TRACE(
"pszFullPath (2): %S\n", pszFullPath);
1817 pszPatternPart = &pszFullPath[
_tcslen(pszFullPath)];
1818 if (pszPatternPart[-1] !=
_T(
'\\'))
1819 *pszPatternPart++ =
_T(
'\\');
1823 TRACE(
"pszPatternPart (2): %S\n", pszPatternPart);
1825 if (ppszPatternPart)
1826 *ppszPatternPart = pszPatternPart;
1896 prev_volume[0] =
_T(
'\0');
1902 for (loop = 0; loop < (
UINT)entries; loop++)
1938 ChangedVolume =
TRUE;
1943 if (!
_tcscmp(szFullPath, prev_volume))
1944 ChangedVolume =
FALSE;
1946 _tcscpy(prev_volume, szFullPath);
1953 cPathSep = pszFilePart[-1];
1954 pszFilePart[-1] =
_T(
'\0');
1961 pszFilePart[-1] = cPathSep;
1964 if (
DirList(szFullPath, pszFilePart, &stFlags) != 0)
1971 pszFilePart[-1] =
_T(
'\0');
#define RC_STRING_MAX_SIZE
INT ConvertULargeInteger(ULONGLONG num, LPTSTR des, UINT len, BOOL bPutSeparator)
BOOL IsExistingDirectory(IN LPCTSTR pszPath)
VOID error_parameter_format(TCHAR ch)
VOID error_file_not_found(VOID)
VOID error_invalid_switch(TCHAR ch)
BOOL __cdecl ConOutPrintfPaging(BOOL StartPaging, LPTSTR szFormat,...)
VOID ConOutResPaging(BOOL StartPaging, UINT resID)
VOID GetScreenSize(PSHORT maxx, PSHORT maxy)
BOOL ConPrintfVPaging(PCON_PAGER Pager, BOOL StartPaging, LPTSTR szFormat, va_list arg_ptr)
static VOID DirHelp(VOID)
struct _DirSwitchesFlags DIRSWITCHFLAGS
BOOL(WINAPI * PGETFREEDISKSPACEEX)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER)
static INT PrintSummary(LPCTSTR szPath, ULONG ulFiles, ULONG ulDirs, ULONGLONG u64Bytes, LPDIRSWITCHFLAGS lpFlags, BOOL TotalSummary)
INT FormatTime(TCHAR *lpTime, LPSYSTEMTIME dt)
static VOID DirPrintNewList(PDIRFINDINFO ptrFiles[], DWORD dwCount, LPCTSTR szCurPath, LPDIRSWITCHFLAGS lpFlags)
static ULONG recurse_dir_cnt
static VOID DirPrintOldList(PDIRFINDINFO ptrFiles[], DWORD dwCount, LPCTSTR szCurPath, LPDIRSWITCHFLAGS lpFlags)
static VOID DirPrintWideList(PDIRFINDINFO ptrFiles[], DWORD dwCount, LPCTSTR szCurPath, LPDIRSWITCHFLAGS lpFlags)
struct _DIRFINDLISTNODE * PDIRFINDLISTNODE
static LPTSTR getName(const TCHAR *file, TCHAR *dest)
INT CommandDir(LPTSTR rest)
static INT DirList(IN OUT LPTSTR szFullPath, IN LPTSTR pszFilePart, LPDIRSWITCHFLAGS lpFlags)
static ULONGLONG recurse_bytes
struct _DIRFINDSTREAMNODE * PDIRFINDSTREAMNODE
static BOOL DirReadParam(LPTSTR Line, LPTSTR **params, LPINT entries, LPDIRSWITCHFLAGS lpFlags)
static VOID DirNodeCleanup(PDIRFINDLISTNODE ptrStartNode, PDWORD pdwCount)
FORCEINLINE BOOL IsDotDirectory(IN LPCTSTR pszPath)
struct _DIRFINDINFO * PDIRFINDINFO
struct _DirSwitchesFlags * LPDIRSWITCHFLAGS
INT FormatDate(TCHAR *lpDate, LPSYSTEMTIME dt, BOOL b4Digit)
static VOID ResolvePattern(IN LPTSTR pszPattern, IN DWORD nBufferLength, OUT LPTSTR pszFullPath, OUT LPTSTR *ppszPatternPart OPTIONAL)
FORCEINLINE BOOL IsDotDirectoryN(IN const TCHAR *pPath, IN SIZE_T Length)
static BOOL CompareFiles(PDIRFINDINFO lpFile1, PDIRFINDINFO lpFile2, LPDIRSWITCHFLAGS lpFlags)
static BOOL PrintDirectoryHeader(LPCTSTR szPath, LPDIRSWITCHFLAGS lpFlags)
struct _DIRFINDLISTNODE DIRFINDLISTNODE
static VOID QsortFiles(PDIRFINDINFO ptrArray[], int i, int j, LPDIRSWITCHFLAGS lpFlags)
static VOID DirPrintFileDateTime(TCHAR *lpDate, TCHAR *lpTime, LPWIN32_FIND_DATA lpFile, LPDIRSWITCHFLAGS lpFlags)
static VOID DirPrintFiles(PDIRFINDINFO ptrFiles[], DWORD dwCount, LPCTSTR szCurPath, LPDIRSWITCHFLAGS lpFlags)
TCHAR * getExt(const TCHAR *file)
static VOID GetUserDiskFreeSpace(LPCTSTR lpRoot, PULARGE_INTEGER lpFreeSpace)
struct _DIRFINDSTREAMNODE DIRFINDSTREAMNODE
static ULONG recurse_file_cnt
static BOOL DirPrintf(LPDIRSWITCHFLAGS lpFlags, LPTSTR szFormat,...)
static VOID DirPrintBareList(PDIRFINDINFO ptrFiles[], DWORD dwCount, LPCTSTR szCurPath, LPDIRSWITCHFLAGS lpFlags)
struct _DIRFINDINFO DIRFINDINFO
static VOID StripQuotes(LPSTR in)
static VOID freep(LPSTR *p)
BOOL add_entry(LPINT ac, LPSTR **arg, LPCSTR entry)
#define GetProcAddress(x, y)
#define INVALID_HANDLE_VALUE
static void cleanup(void)
BOOL WINAPI FindClose(HANDLE hFindFile)
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
BOOL WINAPI FileTimeToLocalFileTime(IN CONST FILETIME *lpFileTime, OUT LPFILETIME lpLocalFileTime)
GLenum const GLfloat * params
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
struct _ULARGE_INTEGER * PULARGE_INTEGER
unsigned __int3264 UINT_PTR
#define FILE_ATTRIBUTE_READONLY
#define FILE_ATTRIBUTE_HIDDEN
#define FILE_ATTRIBUTE_SYSTEM
#define FILE_ATTRIBUTE_ARCHIVE
#define FILE_ATTRIBUTE_DIRECTORY
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define FILE_ATTRIBUTE_REPARSE_POINT
INT ConPrintfV(IN PCON_STREAM Stream, IN PCWSTR szStr, IN va_list args)
static const WCHAR szName[]
PULONG MinorVersion OPTIONAL
WIN32_FIND_DATA stFindInfo
PDIRFINDSTREAMNODE ptrHead
struct _DIRFINDLISTNODE * ptrNext
struct _DIRFINDSTREAMNODE * ptrNext
WIN32_FIND_STREAM_DATA stStreamInfo
enum ETimeField eTimeField
enum EOrderBy eCriteria[3]
struct _DirSwitchesFlags::@62 stOrderBy
struct _DirSwitchesFlags::@63 stTimeField
struct _DirSwitchesFlags::@61 stAttribs
#define GetEnvironmentVariable
#define GetVolumeInformation
#define GetVolumePathName
_In_ LPCSTR _In_opt_ LPCSTR _In_ DWORD nBufferLength