50
50
#endif /* MOZ_UNICODE */
54
static HANDLE CreateFileA(LPCSTR lpFileName,
55
DWORD dwDesiredAccess,
57
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
58
DWORD dwCreationDisposition,
59
DWORD dwFlagsAndAttributes,
62
PRUnichar wFileName[MAX_PATH];
63
MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH);
64
return CreateFileW(wFileName, dwDesiredAccess, dwShareMode,
65
lpSecurityAttributes, dwCreationDisposition,
66
dwFlagsAndAttributes, hTemplateFile);
70
* We seem to call FindFirstFileA and FindNextFileA just to get
71
* the file names in a directory listing. If so, we could define
72
* a custom WIN32_FIND_DATAA structure with just the cFileName
73
* member, and the CopyFindFileDataW2A function could just
74
* copy/convert the cFileName member.
76
static void CopyFindFileDataW2A(LPWIN32_FIND_DATAW from,
77
LPWIN32_FIND_DATAA to)
80
* WIN32_FIND_DATAA and WIN32_FIND_DATAW are slightly different.
81
* The dwReserved0, dwReserved1, and cAlternateFileName members
82
* exist only in WIN32_FIND_DATAA. The dwOID member exists only
83
* in WIN32_FIND_DATAW.
85
to->dwFileAttributes = from->dwFileAttributes;
86
to->ftCreationTime = from->ftCreationTime;
87
to->ftLastAccessTime = from->ftLastAccessTime;
88
to->ftLastWriteTime = from->ftLastWriteTime;
89
to->nFileSizeHigh = from->nFileSizeHigh;
90
to->nFileSizeLow = from->nFileSizeLow;
93
WideCharToMultiByte(CP_ACP, 0, from->cFileName, -1,
94
to->cFileName, MAX_PATH, NULL, NULL);
95
to->cAlternateFileName[0] = '\0';
98
static HANDLE FindFirstFileA(LPCSTR lpFileName,
99
LPWIN32_FIND_DATAA lpFindFileData)
101
PRUnichar wFileName[MAX_PATH];
103
WIN32_FIND_DATAW wFindFileData;
105
MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH);
106
hFindFile = FindFirstFileW(wFileName, &wFindFileData);
107
if (hFindFile != INVALID_HANDLE_VALUE) {
108
CopyFindFileDataW2A(&wFindFileData, lpFindFileData);
113
static BOOL FindNextFileA(HANDLE hFindFile,
114
LPWIN32_FIND_DATAA lpFindFileData)
116
WIN32_FIND_DATAW wFindFileData;
119
rv = FindNextFileW(hFindFile, &wFindFileData);
121
CopyFindFileDataW2A(&wFindFileData, lpFindFileData);
126
static BOOL GetFileAttributesExA(LPCSTR lpFileName,
127
GET_FILEEX_INFO_LEVELS fInfoLevelId,
128
LPVOID lpFileInformation)
130
PRUnichar wFileName[MAX_PATH];
131
MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH);
132
return GetFileAttributesExW(wFileName, fInfoLevelId, lpFileInformation);
135
static BOOL DeleteFileA(LPCSTR lpFileName)
137
PRUnichar wFileName[MAX_PATH];
138
MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH);
139
return DeleteFileW(wFileName);
142
static BOOL MoveFileA(LPCSTR from, LPCSTR to)
144
PRUnichar wFrom[MAX_PATH];
145
PRUnichar wTo[MAX_PATH];
146
MultiByteToWideChar(CP_ACP, 0, from, -1, wFrom, MAX_PATH);
147
MultiByteToWideChar(CP_ACP, 0, to, -1, wTo, MAX_PATH);
148
return MoveFileW(wFrom, wTo);
151
static BOOL CreateDirectoryA(LPCSTR lpPathName,
152
LPSECURITY_ATTRIBUTES lpSecurityAttributes)
154
PRUnichar wPathName[MAX_PATH];
155
MultiByteToWideChar(CP_ACP, 0, lpPathName, -1, wPathName, MAX_PATH);
156
return CreateDirectoryW(wPathName, lpSecurityAttributes);
159
static BOOL RemoveDirectoryA(LPCSTR lpPathName)
161
PRUnichar wPathName[MAX_PATH];
162
MultiByteToWideChar(CP_ACP, 0, lpPathName, -1, wPathName, MAX_PATH);
163
return RemoveDirectoryW(wPathName);
166
static long GetDriveType(const char *lpRootPathName)
168
PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
169
return 0; // The drive type cannot be determined.
172
static DWORD GetFullPathName(const char *lpFileName,
174
const char *lpBuffer,
175
const char **lpFilePart)
178
DWORD len = strlen(lpFileName);
179
if (len > nBufferLength)
182
strncpy((char *)lpBuffer, lpFileName, len);
183
((char *)lpBuffer)[len] = '\0';
186
char *sep = strrchr(lpBuffer, '\\');
188
sep++; // pass the seperator
191
*lpFilePart = lpBuffer;
197
static BOOL LockFile(HANDLE hFile,
198
DWORD dwFileOffsetLow,
199
DWORD dwFileOffsetHigh,
200
DWORD nNumberOfBytesToLockLow,
201
DWORD nNumberOfBytesToLockHigh)
203
OVERLAPPED overlapped = {0};
204
overlapped.Offset = dwFileOffsetLow;
205
overlapped.OffsetHigh = dwFileOffsetHigh;
206
return LockFileEx(hFile,
207
LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY,
209
nNumberOfBytesToLockLow,
210
nNumberOfBytesToLockHigh, &overlapped);
213
static BOOL UnlockFile(HANDLE hFile,
214
DWORD dwFileOffsetLow,
215
DWORD dwFileOffsetHigh,
216
DWORD nNumberOfBytesToUnlockLow,
217
DWORD nNumberOfBytesToUnlockHigh)
219
OVERLAPPED overlapped = {0};
220
overlapped.Offset = dwFileOffsetLow;
221
overlapped.OffsetHigh = dwFileOffsetHigh;
222
return UnlockFileEx(hFile,
224
nNumberOfBytesToUnlockLow,
225
nNumberOfBytesToUnlockHigh, &overlapped);
228
static unsigned char *_mbsdec(const unsigned char *string1,
229
const unsigned char *string2)
235
static unsigned char *_mbsinc(const unsigned char *inCurrent)
238
return (unsigned char *)(inCurrent + 1);
53
243
struct _MDLock _pr_ioq_lock;