ReactOS 0.4.16-dev-1276-g70732b0
filedefext.cpp File Reference
#include "precomp.h"
#include <ndk/iofuncs.h>
#include <ndk/obfuncs.h>
Include dependency graph for filedefext.cpp:

Go to the source code of this file.

Classes

struct  DIRTREESTATS
 

Macros

#define NTOS_MODE_USER
 
#define SetMultifileDlgFileAttr(attr, id)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (shell)
 
EXTERN_C BOOL PathIsExeW (LPCWSTR lpszPath)
 
static BOOL SH32_GetFileFindData (PCWSTR pszPath, WIN32_FIND_DATAW *pWFD)
 
BOOL GetPhysicalFileSize (LPCWSTR pszPath, PULARGE_INTEGER Size)
 
static UINT GetFileStats (HANDLE hFile, PULARGE_INTEGER pVirtSize, PULARGE_INTEGER pPhysSize)
 
static UINT GetFileStats (PCWSTR pszPath, PULARGE_INTEGER pVirtSize, PULARGE_INTEGER pPhysSize)
 
UINT SH_FormatInteger (LONGLONG Num, LPWSTR pwszResult, UINT cchResultMax)
 
UINT SH_FormatByteSize (LONGLONG cbSize, LPWSTR pwszResult, UINT cchResultMax)
 
LPWSTR SH_FormatFileSizeWithBytes (const PULARGE_INTEGER lpQwSize, LPWSTR pwszResult, UINT cchResultMax)
 
static UINT ProcessDirStatsItem (PCWSTR pszPath, DIRTREESTATS &Stats, WIN32_FIND_DATAW *pWFD)
 

Variables

static const WCHAR s_szShellClassInfo [] = L".ShellClassInfo"
 
static const WCHAR s_szIconIndex [] = L"IconIndex"
 
static const WCHAR s_szIconFile [] = L"IconFile"
 
static const WCHAR s_szIconResource [] = L"IconResource"
 

Macro Definition Documentation

◆ NTOS_MODE_USER

#define NTOS_MODE_USER

Definition at line 24 of file filedefext.cpp.

◆ SetMultifileDlgFileAttr

#define SetMultifileDlgFileAttr (   attr,
  id 
)
Value:
do \
{ \
if (Stats.fAttribSet & (attr)) \
CheckDlgButton(m_hWndDirStatsDlg, (id), BST_CHECKED); \
else if (Stats.fAttribAll & (attr)) \
CheckDlgButton(m_hWndDirStatsDlg, (id), BST_INDETERMINATE); \
} while (0)
Definition: cookie.c:202
#define BST_INDETERMINATE
Definition: winuser.h:198
#define BST_CHECKED
Definition: winuser.h:197

Function Documentation

◆ GetFileStats() [1/2]

static UINT GetFileStats ( HANDLE  hFile,
PULARGE_INTEGER  pVirtSize,
PULARGE_INTEGER  pPhysSize 
)
static

Definition at line 66 of file filedefext.cpp.

67{
70 FILE_BASIC_INFORMATION BasicInfo;
71 Status = NtQueryInformationFile(hFile, &IoStatusBlock, &BasicInfo, sizeof(BasicInfo), FileBasicInformation);
72 if (!NT_SUCCESS(Status))
74
75 if ((pVirtSize || pPhysSize) && !(BasicInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY))
76 {
80 if (!NT_SUCCESS(Status))
82 if (pVirtSize)
83 pVirtSize->QuadPart = FileInfo.EndOfFile.QuadPart;
84 if (pPhysSize)
85 pPhysSize->QuadPart = FileInfo.AllocationSize.QuadPart;
86 }
87 return BasicInfo.FileAttributes;
88}
LONG NTSTATUS
Definition: precomp.h:26
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
@ FileBasicInformation
Definition: from_kernel.h:65
Status
Definition: gdiplustypes.h:25
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
_In_ HANDLE hFile
Definition: mswsock.h:90
NTSYSAPI NTSTATUS NTAPI NtQueryInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, OUT PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define FileStandardInformation
Definition: propsheet.cpp:61
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23

Referenced by GetFileStats(), and ProcessDirStatsItem().

◆ GetFileStats() [2/2]

static UINT GetFileStats ( PCWSTR  pszPath,
PULARGE_INTEGER  pVirtSize,
PULARGE_INTEGER  pPhysSize 
)
static

Definition at line 91 of file filedefext.cpp.

92{
97 {
98 UINT Attrib = GetFileStats(hFile, pVirtSize, pPhysSize);
100 return Attrib;
101 }
102
104 if (!SH32_GetFileFindData(pszPath, &Data))
106 if (pVirtSize)
107 {
108 pVirtSize->u.LowPart = Data.nFileSizeLow;
109 pVirtSize->u.HighPart = Data.nFileSizeHigh;
110 }
111 if (pPhysSize)
112 {
113 pPhysSize->u.LowPart = Data.nFileSizeLow;
114 pPhysSize->u.HighPart = Data.nFileSizeHigh;
115 // TODO: Should we round up to cluster size?
116 }
117 return Data.dwFileAttributes;
118}
#define NULL
Definition: types.h:112
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileW
Definition: compat.h:741
#define FILE_SHARE_READ
Definition: compat.h:136
static BOOL SH32_GetFileFindData(PCWSTR pszPath, WIN32_FIND_DATAW *pWFD)
Definition: filedefext.cpp:32
static UINT GetFileStats(HANDLE hFile, PULARGE_INTEGER pVirtSize, PULARGE_INTEGER pPhysSize)
Definition: filedefext.cpp:66
#define FILE_FLAG_BACKUP_SEMANTICS
Definition: disk.h:41
#define FILE_FLAG_OPEN_NO_RECALL
Definition: disk.h:38
unsigned int UINT
Definition: ndis.h:50
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
struct _ULARGE_INTEGER::@4308 u

◆ GetPhysicalFileSize()

BOOL GetPhysicalFileSize ( LPCWSTR  pszPath,
PULARGE_INTEGER  Size 
)

Definition at line 38 of file filedefext.cpp.

39{
44 {
45 ERR("Failed to open file for GetPhysicalFileSize\n");
46 return FALSE;
47 }
48
53 if (NT_SUCCESS(Status))
54 {
55 Size->QuadPart = FileInfo.AllocationSize.QuadPart;
56 }
57 else
58 {
59 ERR("NtQueryInformationFile failed for %S (Status: %08lX)\n", pszPath, Status);
60 }
62 return NT_SUCCESS(Status);
63}
#define ERR(fmt,...)
Definition: precomp.h:57
#define FALSE
Definition: types.h:117
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533

Referenced by DECLARE_INTERFACE_(), and CFileDefExt::InitFileAttr().

◆ PathIsExeW()

EXTERN_C BOOL PathIsExeW ( LPCWSTR  lpszPath)

Definition at line 539 of file shellpath.c.

540{
541 LPCWSTR lpszExtension = PathGetExtensionW(lpszPath);
542 int i;
543 static const WCHAR lpszExtensions[][4] =
544 {L"exe", L"com", L"pif", L"cmd", L"bat", L"scf", L"scr", L"" };
545
546 TRACE("path=%s\n",debugstr_w(lpszPath));
547
548 for(i=0; lpszExtensions[i][0]; i++)
549 if (!wcsicmp(lpszExtension,lpszExtensions[i])) return TRUE;
550
551 return FALSE;
552}
#define TRUE
Definition: types.h:120
#define wcsicmp
Definition: compat.h:15
static LPWSTR PathGetExtensionW(LPCWSTR lpszPath)
Definition: shellpath.c:434
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
Definition: glfuncs.h:248
#define debugstr_w
Definition: kernel32.h:32
#define L(x)
Definition: ntvdm.h:50
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

◆ ProcessDirStatsItem()

static UINT ProcessDirStatsItem ( PCWSTR  pszPath,
DIRTREESTATS Stats,
WIN32_FIND_DATAW pWFD 
)
static

Definition at line 853 of file filedefext.cpp.

854{
855 UINT fAttrib;
856 ULARGE_INTEGER nVirtSize, nPhysSize;
857 if (pWFD && (pWFD->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
858 {
859 fAttrib = pWFD->dwFileAttributes;
860 }
861 else
862 {
863 fAttrib = GetFileStats(pszPath, &nVirtSize, &nPhysSize);
864 if (fAttrib == INVALID_FILE_ATTRIBUTES)
865 return fAttrib;
866 }
867
868 Stats.fAttribSet &= fAttrib;
869 Stats.fAttribAll |= fAttrib;
870 if (fAttrib & FILE_ATTRIBUTE_DIRECTORY)
871 {
872 (*Stats.pDirCount)++;
873 }
874 else
875 {
876 (*Stats.pFileCount)++;
877 Stats.pTotVirtSize->QuadPart += nVirtSize.QuadPart;
878 Stats.pTotPhysSize->QuadPart += nPhysSize.QuadPart;
879 }
880
881 if (!Stats.bMultipleTypes)
882 {
883 SHFILEINFOW shfi;
884 if (!SHGetFileInfoW(pszPath, fAttrib, &shfi, sizeof(shfi),
886 Stats.bMultipleTypes = TRUE;
887 else if (!Stats.szType[0])
888 wcscpy(Stats.szType, shfi.szTypeName);
889 else
890 Stats.bMultipleTypes = lstrcmpW(Stats.szType, shfi.szTypeName);
891 }
892 return fAttrib;
893}
wcscpy
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4243
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:430
#define SHGFI_TYPENAME
Definition: shellapi.h:167
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:181
PULARGE_INTEGER pTotPhysSize
Definition: filedefext.cpp:815
WCHAR szType[max(100, RTL_FIELD_SIZE(SHFILEINFOA, szTypeName))]
Definition: filedefext.cpp:820
PDWORD pFileCount
Definition: filedefext.cpp:814
BOOL bMultipleTypes
Definition: filedefext.cpp:818
PDWORD pDirCount
Definition: filedefext.cpp:814
PULARGE_INTEGER pTotVirtSize
Definition: filedefext.cpp:815
WCHAR szTypeName[80]
Definition: shellapi.h:388

Referenced by CFileDefExt::WalkDirTree().

◆ SH32_GetFileFindData()

static BOOL SH32_GetFileFindData ( PCWSTR  pszPath,
WIN32_FIND_DATAW pWFD 
)
static

Definition at line 32 of file filedefext.cpp.

33{
34 HANDLE hFind = FindFirstFileW(pszPath, pWFD);
35 return hFind != INVALID_HANDLE_VALUE ? FindClose(hFind) : FALSE;
36}
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502

Referenced by GetFileStats(), and CFileDefExt::InitFileAttr().

◆ SH_FormatByteSize()

UINT SH_FormatByteSize ( LONGLONG  cbSize,
LPWSTR  pwszResult,
UINT  cchResultMax 
)

Definition at line 274 of file filedefext.cpp.

275{
276 /* Write formated bytes count */
277 INT cchWritten = SH_FormatInteger(cbSize, pwszResult, cchResultMax);
278 if (!cchWritten)
279 return 0;
280
281 /* Copy " bytes" to buffer */
282 LPWSTR pwszEnd = pwszResult + cchWritten;
283 size_t cchRemaining = cchResultMax - cchWritten;
284 StringCchCopyExW(pwszEnd, cchRemaining, L" ", &pwszEnd, &cchRemaining, 0);
285 cchWritten = LoadStringW(shell32_hInstance, IDS_BYTES_FORMAT, pwszEnd, cchRemaining);
286 cchRemaining -= cchWritten;
287
288 return cchResultMax - cchRemaining;
289}
#define shell32_hInstance
#define IDS_BYTES_FORMAT
Definition: resource.h:122
INT WINAPI DECLSPEC_HOTPATCH LoadStringW(HINSTANCE instance, UINT resource_id, LPWSTR buffer, INT buflen)
Definition: string.c:1220
UINT SH_FormatInteger(LONGLONG Num, LPWSTR pwszResult, UINT cchResultMax)
Definition: filedefext.cpp:218
STRSAFEAPI StringCchCopyExW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcchRemaining, STRSAFE_DWORD dwFlags)
Definition: strsafe.h:184
int32_t INT
Definition: typedefs.h:58
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by CDrvDefExt::InitGeneralPage(), and SH_FormatFileSizeWithBytes().

◆ SH_FormatFileSizeWithBytes()

LPWSTR SH_FormatFileSizeWithBytes ( const PULARGE_INTEGER  lpQwSize,
LPWSTR  pwszResult,
UINT  cchResultMax 
)

Definition at line 304 of file filedefext.cpp.

305{
306 /* Format bytes in KBs, MBs etc */
307 if (StrFormatByteSizeW(lpQwSize->QuadPart, pwszResult, cchResultMax) == NULL)
308 return NULL;
309
310 /* If there is less bytes than 1KB, we have nothing to do */
311 if (lpQwSize->QuadPart < 1024)
312 return pwszResult;
313
314 /* Concatenate " (" */
315 UINT cchWritten = wcslen(pwszResult);
316 LPWSTR pwszEnd = pwszResult + cchWritten;
317 size_t cchRemaining = cchResultMax - cchWritten;
318 StringCchCopyExW(pwszEnd, cchRemaining, L" (", &pwszEnd, &cchRemaining, 0);
319
320 /* Write formated bytes count */
321 cchWritten = SH_FormatByteSize(lpQwSize->QuadPart, pwszEnd, cchRemaining);
322 pwszEnd += cchWritten;
323 cchRemaining -= cchWritten;
324
325 /* Copy ")" to the buffer */
326 StringCchCopyW(pwszEnd, cchRemaining, L")");
327
328 return pwszResult;
329}
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2394
UINT SH_FormatByteSize(LONGLONG cbSize, LPWSTR pwszResult, UINT cchResultMax)
Definition: filedefext.cpp:274
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149

Referenced by CFileDefExt::InitFileAttr(), and CFileDefExt::UpdateDirStatsResults().

◆ SH_FormatInteger()

UINT SH_FormatInteger ( LONGLONG  Num,
LPWSTR  pwszResult,
UINT  cchResultMax 
)

Definition at line 218 of file filedefext.cpp.

219{
220 // Print the number in uniform mode
221 WCHAR wszNumber[24];
222 swprintf(wszNumber, L"%I64u", Num);
223
224 // Get system strings for decimal and thousand separators.
225 WCHAR wszDecimalSep[8], wszThousandSep[8];
226 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, wszDecimalSep, _countof(wszDecimalSep));
227 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, wszThousandSep, _countof(wszThousandSep));
228
229 // Initialize format for printing the number in bytes
230 NUMBERFMTW nf;
231 ZeroMemory(&nf, sizeof(nf));
232 nf.lpDecimalSep = wszDecimalSep;
233 nf.lpThousandSep = wszThousandSep;
234
235 // Get system string for groups separator
236 WCHAR wszGrouping[12];
239 wszGrouping,
240 _countof(wszGrouping));
241
242 // Convert grouping specs from string to integer
243 for (INT i = 0; i < cchGrouping; i++)
244 {
245 WCHAR wch = wszGrouping[i];
246
247 if (wch >= L'0' && wch <= L'9')
248 nf.Grouping = nf.Grouping * 10 + (wch - L'0');
249 else if (wch != L';')
250 break;
251 }
252
253 if ((nf.Grouping % 10) == 0)
254 nf.Grouping /= 10;
255 else
256 nf.Grouping *= 10;
257
258 // Format the number
260 0,
261 wszNumber,
262 &nf,
263 pwszResult,
264 cchResultMax);
265
266 if (!cchResult)
267 return 0;
268
269 // GetNumberFormatW returns number of characters including UNICODE_NULL
270 return cchResult - 1;
271}
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1666
#define swprintf
Definition: precomp.h:40
INT WINAPI GetNumberFormatW(LCID lcid, DWORD dwFlags, LPCWSTR lpszValue, const NUMBERFMTW *lpFormat, LPWSTR lpNumberStr, int cchOut)
Definition: lcformat.c:1208
#define LOCALE_USER_DEFAULT
#define _countof(array)
Definition: sndvol32.h:70
LPWSTR lpDecimalSep
Definition: winnls.h:665
UINT Grouping
Definition: winnls.h:664
LPWSTR lpThousandSep
Definition: winnls.h:666
#define ZeroMemory
Definition: winbase.h:1753
#define LOCALE_SGROUPING
Definition: winnls.h:51
#define LOCALE_SDECIMAL
Definition: winnls.h:49
#define LOCALE_STHOUSAND
Definition: winnls.h:50

Referenced by SH_FormatByteSize().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( shell  )

Variable Documentation

◆ s_szIconFile

const WCHAR s_szIconFile[] = L"IconFile"
static

◆ s_szIconIndex

const WCHAR s_szIconIndex[] = L"IconIndex"
static

◆ s_szIconResource

const WCHAR s_szIconResource[] = L"IconResource"
static

◆ s_szShellClassInfo

const WCHAR s_szShellClassInfo[] = L".ShellClassInfo"
static