ReactOS 0.4.15-dev-8064-gdaf8068
attrib.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <windef.h>
#include <winbase.h>
#include <wincon.h>
#include <winuser.h>
#include <strsafe.h>
#include <conutils.h>
#include "resource.h"
Include dependency graph for attrib.c:

Go to the source code of this file.

Classes

struct  _ATTRIBS_MASKS
 
struct  _ENUMFILES_CTX
 

Macros

#define ALL_FILES_PATTERN   L"*.*"
 
#define ENUM_RECURSE   0x01
 
#define ENUM_DIRECTORIES   0x02
 

Typedefs

typedef struct _ATTRIBS_MASKS ATTRIBS_MASKS
 
typedef struct _ATTRIBS_MASKSPATTRIBS_MASKS
 
typedef BOOL(* PENUMFILES_CALLBACK) (_In_ PWIN32_FIND_DATAW pFindData, _In_ PCWSTR pszFullName, _Inout_opt_ PVOID Context)
 
typedef struct _ENUMFILES_CTX ENUMFILES_CTX
 
typedef struct _ENUMFILES_CTXPENUMFILES_CTX
 

Functions

static VOID ErrorMessage (_In_ DWORD dwErrorCode, _In_opt_ PCWSTR pszMsg,...)
 
static BOOL PrintAttributes (_In_ PWIN32_FIND_DATAW pFindData, _In_ PCWSTR pszFullName, _Inout_opt_ PVOID Context)
 Displays attributes for the given file.
 
static BOOL ChangeAttributes (_In_ PWIN32_FIND_DATAW pFindData, _In_ PCWSTR pszFullName, _Inout_opt_ PVOID Context)
 Changes attributes for the given file.
 
static BOOL EnumFilesWorker (_Inout_ PENUMFILES_CTX EnumCtx, _Inout_ off_t offFilePart)
 
static BOOL AttribEnumFiles (_In_ PCWSTR pszPath, _In_ PCWSTR pszFile, _In_ DWORD fFlags, _In_ PATTRIBS_MASKS AttribsMasks)
 
int wmain (int argc, WCHAR *argv[])
 

Variables

CON_SCREEN StdOutScreen = INIT_CON_SCREEN(StdOut)
 

Macro Definition Documentation

◆ ALL_FILES_PATTERN

#define ALL_FILES_PATTERN   L"*.*"

Definition at line 28 of file attrib.c.

◆ ENUM_DIRECTORIES

#define ENUM_DIRECTORIES   0x02

Definition at line 120 of file attrib.c.

◆ ENUM_RECURSE

#define ENUM_RECURSE   0x01

Definition at line 119 of file attrib.c.

Typedef Documentation

◆ ATTRIBS_MASKS

◆ ENUMFILES_CTX

◆ PATTRIBS_MASKS

◆ PENUMFILES_CALLBACK

typedef BOOL(* PENUMFILES_CALLBACK) (_In_ PWIN32_FIND_DATAW pFindData, _In_ PCWSTR pszFullName, _Inout_opt_ PVOID Context)

Definition at line 122 of file attrib.c.

◆ PENUMFILES_CTX

Function Documentation

◆ AttribEnumFiles()

static BOOL AttribEnumFiles ( _In_ PCWSTR  pszPath,
_In_ PCWSTR  pszFile,
_In_ DWORD  fFlags,
_In_ PATTRIBS_MASKS  AttribsMasks 
)
static

Definition at line 270 of file attrib.c.

275{
276 ENUMFILES_CTX EnumContext = {0};
277 size_t offFilePart;
278 HRESULT hRes;
279
280 EnumContext.FileName = pszFile;
281 EnumContext.Flags = fFlags;
282 EnumContext.Callback = (AttribsMasks->dwMask == 0 ? PrintAttributes : ChangeAttributes);
283 EnumContext.Context = (AttribsMasks->dwMask == 0 ? NULL : AttribsMasks);
284
285 /* Prepare the full file path buffer */
286 EnumContext.cchBuffer = _countof(EnumContext.FullPathBuffer);
287 hRes = StringCchCopyExW(EnumContext.FullPathBuffer,
288 EnumContext.cchBuffer,
289 pszPath,
290 NULL,
291 &offFilePart,
292 0);
293 if (hRes != S_OK)
294 return FALSE;
295
296 /* Offset to the file name part */
297 offFilePart = EnumContext.cchBuffer - offFilePart;
298 if (EnumContext.FullPathBuffer[offFilePart - 1] != L'\\')
299 {
300 EnumContext.FullPathBuffer[offFilePart] = L'\\';
301 EnumContext.FullPathBuffer[offFilePart + 1] = UNICODE_NULL;
302 offFilePart++;
303 }
304
305 return EnumFilesWorker(&EnumContext, offFilePart);
306}
static BOOL PrintAttributes(_In_ PWIN32_FIND_DATAW pFindData, _In_ PCWSTR pszFullName, _Inout_opt_ PVOID Context)
Displays attributes for the given file.
Definition: attrib.c:68
static BOOL EnumFilesWorker(_Inout_ PENUMFILES_CTX EnumCtx, _Inout_ off_t offFilePart)
Definition: attrib.c:151
static BOOL ChangeAttributes(_In_ PWIN32_FIND_DATAW pFindData, _In_ PCWSTR pszFullName, _Inout_opt_ PVOID Context)
Changes attributes for the given file.
Definition: attrib.c:106
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define S_OK
Definition: intsafe.h:52
#define UNICODE_NULL
#define L(x)
Definition: ntvdm.h:50
#define _countof(array)
Definition: sndvol32.h:68
STRSAFEAPI StringCchCopyExW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcchRemaining, STRSAFE_DWORD dwFlags)
Definition: strsafe.h:184
size_t cchBuffer
Definition: attrib.c:144
_In_ DWORD Flags
Definition: attrib.c:132
_In_ PCWSTR FileName
Definition: attrib.c:131
WCHAR FullPathBuffer[MAX_PATH+_countof("\\" ALL_FILES_PATTERN)]
Definition: attrib.c:145
_In_ PENUMFILES_CALLBACK Callback
Definition: attrib.c:135
_In_ PVOID Context
Definition: attrib.c:136

Referenced by wmain().

◆ ChangeAttributes()

static BOOL ChangeAttributes ( _In_ PWIN32_FIND_DATAW  pFindData,
_In_ PCWSTR  pszFullName,
_Inout_opt_ PVOID  Context 
)
static

Changes attributes for the given file.

Returns
TRUE if anything changed, FALSE otherwise.

Definition at line 106 of file attrib.c.

110{
111 PATTRIBS_MASKS AttribsMasks = (PATTRIBS_MASKS)Context;
113
114 dwAttributes = ((pFindData->dwFileAttributes & ~AttribsMasks->dwMask) | AttribsMasks->dwAttrib);
115 return SetFileAttributesW(pszFullName, dwAttributes);
116}
struct _ATTRIBS_MASKS * PATTRIBS_MASKS
BOOL WINAPI SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes)
Definition: fileinfo.c:794
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD dwAttrib
Definition: attrib.c:98
DWORD dwAttributes
Definition: vdmdbg.h:34

Referenced by AttribEnumFiles().

◆ EnumFilesWorker()

static BOOL EnumFilesWorker ( _Inout_ PENUMFILES_CTX  EnumCtx,
_Inout_ off_t  offFilePart 
)
static

Definition at line 151 of file attrib.c.

154{
155 BOOL bFound = FALSE;
156 HRESULT hRes;
157 HANDLE hFind;
158 PWSTR findFileName = EnumCtx->findData.cFileName;
159 PWSTR pFilePart = EnumCtx->FullPathBuffer + offFilePart;
160 size_t cchRemaining = EnumCtx->cchBuffer - offFilePart;
161
162 /* Recurse over all subdirectories */
163 if (EnumCtx->Flags & ENUM_RECURSE)
164 {
165 /* Append '*.*' */
166 hRes = StringCchCopyW(pFilePart, cchRemaining, ALL_FILES_PATTERN);
167 if (hRes != S_OK)
168 {
170 {
171 // TODO: If this fails, try to reallocate EnumCtx->FullPathBuffer by
172 // increasing its size by _countof(EnumCtx->findData.cFileName) + 1
173 // to satisfy this copy, as well as the one made in the loop below.
174 }
175 // else
176 ConPrintf(StdErr, L"Directory level too deep: %s\n", EnumCtx->FullPathBuffer);
177 return FALSE;
178 }
179
180 hFind = FindFirstFileW(EnumCtx->FullPathBuffer, &EnumCtx->findData);
181 if (hFind == INVALID_HANDLE_VALUE)
182 {
184 if ((Error != ERROR_DIRECTORY) &&
187 {
188 ErrorMessage(Error, EnumCtx->FullPathBuffer);
189 }
190 return FALSE;
191 }
192
193 do
194 {
195 BOOL bIsReparse;
196 size_t offNewFilePart;
197
198 if (!(EnumCtx->findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
199 continue;
200
201 if (!wcscmp(findFileName, L".") || !wcscmp(findFileName, L".."))
202 continue;
203
204 /* Allow at most 2 levels of reparse points / symbolic links */
205 bIsReparse = !!(EnumCtx->findData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT);
206 if (bIsReparse)
207 {
208 if (EnumCtx->uReparseLevel < 2)
209 EnumCtx->uReparseLevel++;
210 else
211 continue;
212 }
213
214 hRes = StringCchPrintfExW(pFilePart, cchRemaining,
215 NULL, &offNewFilePart, 0,
216 L"%s\\", findFileName);
217 /* Offset to the new file name part */
218 offNewFilePart = EnumCtx->cchBuffer - offNewFilePart;
219
220 bFound |= EnumFilesWorker(EnumCtx, offNewFilePart);
221
222 /* Recalculate the file part pointer and the number of characters
223 * remaining: the buffer may have been enlarged and relocated. */
224 pFilePart = EnumCtx->FullPathBuffer + offFilePart;
225 cchRemaining = EnumCtx->cchBuffer - offFilePart;
226
227 /* If we went through a reparse point / symbolic link, decrease level */
228 if (bIsReparse)
229 EnumCtx->uReparseLevel--;
230 }
231 while (FindNextFileW(hFind, &EnumCtx->findData));
232 FindClose(hFind);
233 }
234
235 /* Append the file name pattern to search for */
236 hRes = StringCchCopyW(pFilePart, cchRemaining, EnumCtx->FileName);
237
238 /* Search in the current directory */
239 hFind = FindFirstFileW(EnumCtx->FullPathBuffer, &EnumCtx->findData);
240 if (hFind == INVALID_HANDLE_VALUE)
241 return bFound;
242
243 do
244 {
245 BOOL bIsDir = !!(EnumCtx->findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
246 BOOL bExactMatch = (wcsicmp(findFileName, EnumCtx->FileName) == 0);
247
248 if (bIsDir && !(EnumCtx->Flags & ENUM_DIRECTORIES) && !bExactMatch)
249 continue;
250
251 if (!wcscmp(findFileName, L".") || !wcscmp(findFileName, L".."))
252 continue;
253
254 /* If we recursively enumerate files excluding directories,
255 * exclude any directory from the enumeration. */
256 if (bIsDir && !(EnumCtx->Flags & ENUM_DIRECTORIES) && (EnumCtx->Flags & ENUM_RECURSE))
257 continue;
258
259 StringCchCopyW(pFilePart, cchRemaining, findFileName);
260 /* bFound = */ EnumCtx->Callback(&EnumCtx->findData, EnumCtx->FullPathBuffer, EnumCtx->Context);
261 bFound = TRUE;
262 }
263 while (FindNextFileW(hFind, &EnumCtx->findData));
264 FindClose(hFind);
265
266 return bFound;
267}
#define ENUM_DIRECTORIES
Definition: attrib.c:120
static VOID ErrorMessage(_In_ DWORD dwErrorCode, _In_opt_ PCWSTR pszMsg,...)
Definition: attrib.c:33
#define ENUM_RECURSE
Definition: attrib.c:119
#define ALL_FILES_PATTERN
Definition: attrib.c:28
void ConPrintf(FILE *fp, LPCWSTR psz,...)
Definition: fc.c:20
#define StdErr
Definition: fc.c:15
BOOL Error
Definition: chkdsk.c:66
#define TRUE
Definition: types.h:120
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define wcsicmp
Definition: compat.h:15
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
unsigned int BOOL
Definition: ntddk_ex.h:94
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define FILE_ATTRIBUTE_REPARSE_POINT
Definition: ntifs_ex.h:381
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
STRSAFEAPI StringCchPrintfExW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcchRemaining, STRSAFE_DWORD dwFlags, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:585
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
#define STRSAFE_E_INSUFFICIENT_BUFFER
Definition: strsafe.h:103
uint16_t * PWSTR
Definition: typedefs.h:56
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define ERROR_SHARING_VIOLATION
Definition: winerror.h:135
#define ERROR_DIRECTORY
Definition: winerror.h:295

Referenced by AttribEnumFiles(), and EnumFilesWorker().

◆ ErrorMessage()

static VOID ErrorMessage ( _In_ DWORD  dwErrorCode,
_In_opt_ PCWSTR  pszMsg,
  ... 
)
static

Definition at line 33 of file attrib.c.

37{
38 INT Len;
39 va_list arg_ptr;
40
41 if (dwErrorCode == ERROR_SUCCESS)
42 return;
43
44 va_start(arg_ptr, pszMsg);
47 NULL,
48 dwErrorCode,
50 &arg_ptr);
51 va_end(arg_ptr);
52
53 /* Fall back just in case the error is not defined */
54 if (Len <= 0)
56
57 /* Display the extra optional message if necessary */
58 if (pszMsg)
59 ConPrintf(StdErr, L" %s\n", pszMsg);
60}
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define STRING_CONSOLE_ERROR
Definition: resource.h:6
void ConResPrintf(FILE *fp, UINT nID,...)
Definition: fc.c:33
#define Len
Definition: deflate.h:82
#define ERROR_SUCCESS
Definition: deptool.c:10
INT ConMsgPrintfV(IN PCON_STREAM Stream, IN DWORD dwFlags, IN LPCVOID lpSource OPTIONAL, IN DWORD dwMessageId, IN DWORD dwLanguageId, IN va_list *Arguments OPTIONAL)
Definition: outstream.c:1030
#define LANG_USER_DEFAULT
Definition: tnerror.cpp:50
int32_t INT
Definition: typedefs.h:58
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:423

Referenced by AddAssociation(), cmd_mkdir(), cmd_mklink(), cmd_move(), cmd_rmdir(), cmd_start(), DeleteFiles(), DeleteFolder(), EnumFilesWorker(), ExecuteAsync(), PrintAllAssociations(), PrintAssociation(), PrintAssociationEx(), PrintVolumeHeader(), ProcessPortMessage(), RemoveAssociation(), ShowItemError(), and ShowStepError().

◆ PrintAttributes()

static BOOL PrintAttributes ( _In_ PWIN32_FIND_DATAW  pFindData,
_In_ PCWSTR  pszFullName,
_Inout_opt_ PVOID  Context 
)
static

Displays attributes for the given file.

Returns
Always TRUE (success).

Definition at line 68 of file attrib.c.

72{
73 DWORD dwAttributes = pFindData->dwFileAttributes;
74
76
78#ifdef EXTENDED_ATTRIBUTES
79 L"%c %c%c%c %c %s\n",
80#else
81 L"%c %c%c%c %s\n",
82#endif
87#ifdef EXTENDED_ATTRIBUTES
89#endif
90 pszFullName);
91
92 return TRUE;
93}
#define StdOut
Definition: fc.c:14
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
#define FILE_ATTRIBUTE_ARCHIVE
Definition: nt_native.h:706
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
Definition: ntifs_ex.h:384

Referenced by AttribEnumFiles().

◆ wmain()

int wmain ( int  argc,
WCHAR argv[] 
)

Definition at line 308 of file attrib.c.

309{
310 INT i;
311 DWORD dwEnumFlags = 0;
312 ATTRIBS_MASKS AttribsMasks = {0};
313 BOOL bFound = FALSE;
315 WCHAR szFilePath[MAX_PATH + 2] = L""; // + 2 to reserve an extra path separator and a NULL-terminator.
316
317 /* Initialize the Console Standard Streams */
319
320 /* Check for options and file specifications */
321 for (i = 1; i < argc; i++)
322 {
323 if (*argv[i] == L'/')
324 {
325 /* Print help and bail out if needed */
326 if (wcscmp(argv[i], L"/?") == 0)
327 {
329 return 0;
330 }
331 else
332 /* Retrieve the enumeration modes */
333 if (wcsicmp(argv[i], L"/s") == 0)
334 dwEnumFlags |= ENUM_RECURSE;
335 else if (wcsicmp(argv[i], L"/d") == 0)
336 dwEnumFlags |= ENUM_DIRECTORIES;
337 else
338 {
339 /* Unknown option */
341 return -1;
342 }
343 }
344 else
345 /* Build attributes and mask */
346 if ((*argv[i] == L'+') || (*argv[i] == L'-'))
347 {
348 BOOL bAdd = (*argv[i] == L'+');
349
350 if (wcslen(argv[i]) != 2)
351 {
353 return -1;
354 }
355
356 switch (towupper(argv[i][1]))
357 {
358 case L'A':
359 AttribsMasks.dwMask |= FILE_ATTRIBUTE_ARCHIVE;
360 if (bAdd)
361 AttribsMasks.dwAttrib |= FILE_ATTRIBUTE_ARCHIVE;
362 else
363 AttribsMasks.dwAttrib &= ~FILE_ATTRIBUTE_ARCHIVE;
364 break;
365
366 case L'S':
367 AttribsMasks.dwMask |= FILE_ATTRIBUTE_SYSTEM;
368 if (bAdd)
369 AttribsMasks.dwAttrib |= FILE_ATTRIBUTE_SYSTEM;
370 else
371 AttribsMasks.dwAttrib &= ~FILE_ATTRIBUTE_SYSTEM;
372 break;
373
374 case L'H':
375 AttribsMasks.dwMask |= FILE_ATTRIBUTE_HIDDEN;
376 if (bAdd)
377 AttribsMasks.dwAttrib |= FILE_ATTRIBUTE_HIDDEN;
378 else
379 AttribsMasks.dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN;
380 break;
381
382 case L'R':
383 AttribsMasks.dwMask |= FILE_ATTRIBUTE_READONLY;
384 if (bAdd)
385 AttribsMasks.dwAttrib |= FILE_ATTRIBUTE_READONLY;
386 else
387 AttribsMasks.dwAttrib &= ~FILE_ATTRIBUTE_READONLY;
388 break;
389
390#ifdef EXTENDED_ATTRIBUTES
391 case L'I':
393 if (bAdd)
395 else
396 AttribsMasks.dwAttrib &= ~FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
397 break;
398#endif
399
400 default:
402 return -1;
403 }
404 }
405 else
406 {
407 /* At least one file specification found */
408 bFound = TRUE;
409 }
410 }
411
412 /* If no file specification was found, operate on all files of the current directory */
413 if (!bFound)
414 {
417
418 bFound = AttribEnumFiles(szFilePath, pszFileName, dwEnumFlags, &AttribsMasks);
419 if (!bFound)
421
422 return 0;
423 }
424
425 /* Operate on each file specification */
426 for (i = 1; i < argc; i++)
427 {
428 /* Skip options */
429 if (*argv[i] == L'/' || *argv[i] == L'+' || *argv[i] == L'-')
430 continue;
431
433 if (pszFileName)
434 {
435 /* Move the file part so as to separate and NULL-terminate the directory */
437 sizeof(szFilePath) - (pszFileName -szFilePath + 1) * sizeof(*szFilePath));
439 }
440 else
441 {
442 pszFileName = L"";
443 }
444
445 bFound = AttribEnumFiles(szFilePath, pszFileName, dwEnumFlags, &AttribsMasks);
446 if (!bFound)
448 }
449
450 return 0;
451}
static int argc
Definition: ServiceArgs.c:12
static BOOL AttribEnumFiles(_In_ PCWSTR pszPath, _In_ PCWSTR pszFile, _In_ DWORD fFlags, _In_ PATTRIBS_MASKS AttribsMasks)
Definition: attrib.c:270
#define STRING_ATTRIB_HELP
Definition: resource.h:7
#define STRING_ERROR_INVALID_PARAM_FORMAT
Definition: resource.h:5
#define STRING_FILE_NOT_FOUND
Definition: resource.h:8
#define ConInitStdStreams()
Definition: fc.c:13
void ConResPuts(FILE *fp, UINT nID)
Definition: fc.c:27
#define GetCurrentDirectoryW(x, y)
Definition: compat.h:756
#define MAX_PATH
Definition: compat.h:34
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
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
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define argv
Definition: mplay32.c:18
static WCHAR szFilePath[]
Definition: qotd.c:14
DWORD dwMask
Definition: attrib.c:97
#define towupper(c)
Definition: wctype.h:99
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
#define MoveMemory
Definition: winbase.h:1709
__wchar_t WCHAR
Definition: xmlstorage.h:180

Variable Documentation

◆ StdOutScreen

Definition at line 30 of file attrib.c.

Referenced by cmd_cls().