Current News
Archived News
Search News
Discussion Forum


Old Forum
Install Programs More Downloads...
Troubleshooting
Source Code
Format Specs.
Misc. Information
Non-SF Stuff
Links




CommitLineData
7df24e1f 1/* License information for this code is in license.txt */
2
3// Code for loading SFmpqapi at run-time
4
5// Comment out the next line to load SFmpqapi at the
6// start of your program, rather that when it is first
7// used.
8#define SFMPQAPI_DELAY_LOAD
9
10#include "SFmpqapi_no-lib.h"
11
12struct SFMPQAPI_DELAY_LOADER {
13#ifndef SFMPQAPI_DELAY_LOAD
14 SFMPQAPI_DELAY_LOADER();
15#endif
16 ~SFMPQAPI_DELAY_LOADER();
17} SFMpqApi_Delay_Loader;
18
19HINSTANCE hSFMpq = 0;
20
21void LoadSFMpqDll();
22
23void LoadSFMpqDll()
24{
25 if (!hSFMpq) hSFMpq = LoadLibrary("SFmpq.dll");
26}
27
28BOOL WINAPI MpqInitialize_stub()
29{
30 LoadSFMpqDll();
31 if (hSFMpq) {
32 *(FARPROC *)&MpqInitialize = GetProcAddress(hSFMpq,"MpqInitialize");
33 if (MpqInitialize) return MpqInitialize();
34 }
35 return FALSE;
36}
37
38LPCSTR WINAPI MpqGetVersionString_stub()
39{
40 LoadSFMpqDll();
41 if (hSFMpq) {
42 *(FARPROC *)&MpqGetVersionString = GetProcAddress(hSFMpq,"MpqGetVersionString");
43 if (MpqGetVersionString) return MpqGetVersionString();
44 }
45 return 0;
46}
47
48float WINAPI MpqGetVersion_stub()
49{
50 LoadSFMpqDll();
51 if (hSFMpq) {
52 *(FARPROC *)&MpqGetVersion = GetProcAddress(hSFMpq,"MpqGetVersion");
53 if (MpqGetVersion) return MpqGetVersion();
54 }
55 return 0;
56}
57
58void WINAPI SFMpqDestroy_stub()
59{
60 LoadSFMpqDll();
61 if (hSFMpq) {
62 *(FARPROC *)&SFMpqDestroy = GetProcAddress(hSFMpq,"SFMpqDestroy");
63 if (SFMpqDestroy) SFMpqDestroy();
64 }
65}
66
67void WINAPI AboutSFMpq_stub()
68{
69 LoadSFMpqDll();
70 if (hSFMpq) {
71 *(FARPROC *)&AboutSFMpq = GetProcAddress(hSFMpq,"AboutSFMpq");
72 if (AboutSFMpq) AboutSFMpq();
73 }
74}
75
76LPCSTR WINAPI SFMpqGetVersionString_stub()
77{
78 LoadSFMpqDll();
79 if (hSFMpq) {
80 *(FARPROC *)&SFMpqGetVersionString = GetProcAddress(hSFMpq,"SFMpqGetVersionString");
81 if (SFMpqGetVersionString) return SFMpqGetVersionString();
82 }
83 return 0;
84}
85
86DWORD WINAPI SFMpqGetVersionString2_stub(LPCSTR lpBuffer, DWORD dwBufferLength)
87{
88 LoadSFMpqDll();
89 if (hSFMpq) {
90 *(FARPROC *)&SFMpqGetVersionString2 = GetProcAddress(hSFMpq,"SFMpqGetVersionString2");
91 if (SFMpqGetVersionString2) return SFMpqGetVersionString2(lpBuffer,dwBufferLength);
92 }
93 return 0;
94}
95
96SFMPQVERSION WINAPI SFMpqGetVersion_stub()
97{
98 LoadSFMpqDll();
99 if (hSFMpq) {
100 *(FARPROC *)&SFMpqGetVersion = GetProcAddress(hSFMpq,"SFMpqGetVersion");
101 if (SFMpqGetVersion) return SFMpqGetVersion();
102 }
103 SFMPQVERSION NoVersionData = {0,0,0,0};
104 return NoVersionData;
105}
106
107BOOL WINAPI SFileOpenArchive_stub(LPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ)
108{
109 LoadSFMpqDll();
110 if (hSFMpq) {
111 *(FARPROC *)&SFileOpenArchive = GetProcAddress(hSFMpq,"SFileOpenArchive");
112 if (SFileOpenArchive) return SFileOpenArchive(lpFileName,dwPriority,dwFlags,hMPQ);
113 }
114 return FALSE;
115}
116
117BOOL WINAPI SFileCloseArchive_stub(MPQHANDLE hMPQ)
118{
119 LoadSFMpqDll();
120 if (hSFMpq) {
121 *(FARPROC *)&SFileCloseArchive = GetProcAddress(hSFMpq,"SFileCloseArchive");
122 if (SFileCloseArchive) return SFileCloseArchive(hMPQ);
123 }
124 return FALSE;
125}
126
127BOOL WINAPI SFileOpenFileAsArchive_stub(MPQHANDLE hSourceMPQ, LPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ)
128{
129 LoadSFMpqDll();
130 if (hSFMpq) {
131 *(FARPROC *)&SFileOpenFileAsArchive = GetProcAddress(hSFMpq,"SFileOpenFileAsArchive");
132 if (SFileOpenFileAsArchive) return SFileOpenFileAsArchive(hSourceMPQ,lpFileName,dwPriority,dwFlags,hMPQ);
133 }
134 return FALSE;
135}
136
137BOOL WINAPI SFileGetArchiveName_stub(MPQHANDLE hMPQ, LPCSTR lpBuffer, DWORD dwBufferLength)
138{
139 LoadSFMpqDll();
140 if (hSFMpq) {
141 *(FARPROC *)&SFileGetArchiveName = GetProcAddress(hSFMpq,"SFileGetArchiveName");
142 if (SFileGetArchiveName) return SFileGetArchiveName(hMPQ,lpBuffer,dwBufferLength);
143 }
144 return FALSE;
145}
146
147BOOL WINAPI SFileOpenFile_stub(LPCSTR lpFileName, MPQHANDLE *hFile)
148{
149 LoadSFMpqDll();
150 if (hSFMpq) {
151 *(FARPROC *)&SFileOpenFile = GetProcAddress(hSFMpq,"SFileOpenFile");
152 if (SFileOpenFile) return SFileOpenFile(lpFileName,hFile);
153 }
154 return FALSE;
155}
156
157BOOL WINAPI SFileOpenFileEx_stub(MPQHANDLE hMPQ, LPCSTR lpFileName, DWORD dwSearchScope, MPQHANDLE *hFile)
158{
159 LoadSFMpqDll();
160 if (hSFMpq) {
161 *(FARPROC *)&SFileOpenFileEx = GetProcAddress(hSFMpq,"SFileOpenFileEx");
162 if (SFileOpenFileEx) return SFileOpenFileEx(hMPQ,lpFileName,dwSearchScope,hFile);
163 }
164 return FALSE;
165}
166
167BOOL WINAPI SFileCloseFile_stub(MPQHANDLE hFile)
168{
169 LoadSFMpqDll();
170 if (hSFMpq) {
171 *(FARPROC *)&SFileCloseFile = GetProcAddress(hSFMpq,"SFileCloseFile");
172 if (SFileCloseFile) return SFileCloseFile(hFile);
173 }
174 return FALSE;
175}
176
177DWORD WINAPI SFileGetFileSize_stub(MPQHANDLE hFile, LPDWORD lpFileSizeHigh)
178{
179 LoadSFMpqDll();
180 if (hSFMpq) {
181 *(FARPROC *)&SFileGetFileSize = GetProcAddress(hSFMpq,"SFileGetFileSize");
182 if (SFileGetFileSize) return SFileGetFileSize(hFile,lpFileSizeHigh);
183 }
184 return (DWORD)-1;
185}
186
187BOOL WINAPI SFileGetFileArchive_stub(MPQHANDLE hFile, MPQHANDLE *hMPQ)
188{
189 LoadSFMpqDll();
190 if (hSFMpq) {
191 *(FARPROC *)&SFileGetFileArchive = GetProcAddress(hSFMpq,"SFileGetFileArchive");
192 if (SFileGetFileArchive) return SFileGetFileArchive(hFile,hMPQ);
193 }
194 return FALSE;
195}
196
197BOOL WINAPI SFileGetFileName_stub(MPQHANDLE hFile, LPCSTR lpBuffer, DWORD dwBufferLength)
198{
199 LoadSFMpqDll();
200 if (hSFMpq) {
201 *(FARPROC *)&SFileGetFileName = GetProcAddress(hSFMpq,"SFileGetFileName");
202 if (SFileGetFileName) return SFileGetFileName(hFile,lpBuffer,dwBufferLength);
203 }
204 return FALSE;
205}
206
207DWORD WINAPI SFileSetFilePointer_stub(MPQHANDLE hFile, long lDistanceToMove, PLONG lplDistanceToMoveHigh, DWORD dwMoveMethod)
208{
209 LoadSFMpqDll();
210 if (hSFMpq) {
211 *(FARPROC *)&SFileSetFilePointer = GetProcAddress(hSFMpq,"SFileSetFilePointer");
212 if (SFileSetFilePointer) return SFileSetFilePointer(hFile,lDistanceToMove,lplDistanceToMoveHigh,dwMoveMethod);
213 }
214 return (DWORD)-1;
215}
216
217BOOL WINAPI SFileReadFile_stub(MPQHANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped)
218{
219 LoadSFMpqDll();
220 if (hSFMpq) {
221 *(FARPROC *)&SFileReadFile = GetProcAddress(hSFMpq,"SFileReadFile");
222 if (SFileReadFile) return SFileReadFile(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped);
223 }
224 return FALSE;
225}
226
227LCID WINAPI SFileSetLocale_stub(LCID nNewLocale)
228{
229 LoadSFMpqDll();
230 if (hSFMpq) {
231 *(FARPROC *)&SFileSetLocale = GetProcAddress(hSFMpq,"SFileSetLocale");
232 if (SFileSetLocale) return SFileSetLocale(nNewLocale);
233 }
234 return 0;
235}
236
237BOOL WINAPI SFileGetBasePath_stub(LPCSTR lpBuffer, DWORD dwBufferLength)
238{
239 LoadSFMpqDll();
240 if (hSFMpq) {
241 *(FARPROC *)&SFileGetBasePath = GetProcAddress(hSFMpq,"SFileGetBasePath");
242 if (SFileGetBasePath) return SFileGetBasePath(lpBuffer,dwBufferLength);
243 }
244 return FALSE;
245}
246
247BOOL WINAPI SFileSetBasePath_stub(LPCSTR lpNewBasePath)
248{
249 LoadSFMpqDll();
250 if (hSFMpq) {
251 *(FARPROC *)&SFileSetBasePath = GetProcAddress(hSFMpq,"SFileSetBasePath");
252 if (SFileSetBasePath) return SFileSetBasePath(lpNewBasePath);
253 }
254 return FALSE;
255}
256
257DWORD WINAPI SFileGetFileInfo_stub(MPQHANDLE hFile, DWORD dwInfoType)
258{
259 LoadSFMpqDll();
260 if (hSFMpq) {
261 *(FARPROC *)&SFileGetFileInfo = GetProcAddress(hSFMpq,"SFileGetFileInfo");
262 if (SFileGetFileInfo) return SFileGetFileInfo(hFile,dwInfoType);
263 }
264 return (DWORD)-1;
265}
266
267BOOL WINAPI SFileSetArchivePriority_stub(MPQHANDLE hMPQ, DWORD dwPriority)
268{
269 LoadSFMpqDll();
270 if (hSFMpq) {
271 *(FARPROC *)&SFileSetArchivePriority = GetProcAddress(hSFMpq,"SFileSetArchivePriority");
272 if (SFileSetArchivePriority) return SFileSetArchivePriority(hMPQ,dwPriority);
273 }
274 return FALSE;
275}
276
277DWORD WINAPI SFileFindMpqHeader_stub(HANDLE hFile)
278{
279 LoadSFMpqDll();
280 if (hSFMpq) {
281 *(FARPROC *)&SFileFindMpqHeader = GetProcAddress(hSFMpq,"SFileFindMpqHeader");
282 if (SFileFindMpqHeader) return SFileFindMpqHeader(hFile);
283 }
284 return (DWORD)-1;
285}
286
287BOOL WINAPI SFileListFiles_stub(MPQHANDLE hMPQ, LPCSTR lpFileLists, FILELISTENTRY *lpListBuffer, DWORD dwFlags)
288{
289 LoadSFMpqDll();
290 if (hSFMpq) {
291 *(FARPROC *)&SFileListFiles = GetProcAddress(hSFMpq,"SFileListFiles");
292 if (SFileListFiles) return SFileListFiles(hMPQ,lpFileLists,lpListBuffer,dwFlags);
293 }
294 return FALSE;
295}
296
297MPQHANDLE WINAPI MpqOpenArchiveForUpdate_stub(LPCSTR lpFileName, DWORD dwFlags, DWORD dwMaximumFilesInArchive)
298{
299 LoadSFMpqDll();
300 if (hSFMpq) {
301 *(FARPROC *)&MpqOpenArchiveForUpdate = GetProcAddress(hSFMpq,"MpqOpenArchiveForUpdate");
302 if (MpqOpenArchiveForUpdate) return MpqOpenArchiveForUpdate(lpFileName,dwFlags,dwMaximumFilesInArchive);
303 }
304 return INVALID_HANDLE_VALUE;
305}
306
307DWORD WINAPI MpqCloseUpdatedArchive_stub(MPQHANDLE hMPQ, DWORD dwUnknown2)
308{
309 LoadSFMpqDll();
310 if (hSFMpq) {
311 *(FARPROC *)&MpqCloseUpdatedArchive = GetProcAddress(hSFMpq,"MpqCloseUpdatedArchive");
312 if (MpqCloseUpdatedArchive) return MpqCloseUpdatedArchive(hMPQ,dwUnknown2);
313 }
314 return 0;
315}
316
317BOOL WINAPI MpqAddFileToArchive_stub(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags)
318{
319 LoadSFMpqDll();
320 if (hSFMpq) {
321 *(FARPROC *)&MpqAddFileToArchive = GetProcAddress(hSFMpq,"MpqAddFileToArchive");
322 if (MpqAddFileToArchive) return MpqAddFileToArchive(hMPQ,lpSourceFileName,lpDestFileName,dwFlags);
323 }
324 return FALSE;
325}
326
327BOOL WINAPI MpqAddWaveToArchive_stub(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwQuality)
328{
329 LoadSFMpqDll();
330 if (hSFMpq) {
331 *(FARPROC *)&MpqAddWaveToArchive = GetProcAddress(hSFMpq,"MpqAddWaveToArchive");
332 if (MpqAddWaveToArchive) return MpqAddWaveToArchive(hMPQ,lpSourceFileName,lpDestFileName,dwFlags,dwQuality);
333 }
334 return FALSE;
335}
336
337BOOL WINAPI MpqRenameFile_stub(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName)
338{
339 LoadSFMpqDll();
340 if (hSFMpq) {
341 *(FARPROC *)&MpqRenameFile = GetProcAddress(hSFMpq,"MpqRenameFile");
342 if (MpqRenameFile) return MpqRenameFile(hMPQ,lpcOldFileName,lpcNewFileName);
343 }
344 return FALSE;
345}
346
347BOOL WINAPI MpqDeleteFile_stub(MPQHANDLE hMPQ, LPCSTR lpFileName)
348{
349 LoadSFMpqDll();
350 if (hSFMpq) {
351 *(FARPROC *)&MpqDeleteFile = GetProcAddress(hSFMpq,"MpqDeleteFile");
352 if (MpqDeleteFile) return MpqDeleteFile(hMPQ,lpFileName);
353 }
354 return FALSE;
355}
356
357BOOL WINAPI MpqCompactArchive_stub(MPQHANDLE hMPQ)
358{
359 LoadSFMpqDll();
360 if (hSFMpq) {
361 *(FARPROC *)&MpqCompactArchive = GetProcAddress(hSFMpq,"MpqCompactArchive");
362 if (MpqCompactArchive) return MpqCompactArchive(hMPQ);
363 }
364 return FALSE;
365}
366
a9771b7c 367MPQHANDLE WINAPI MpqOpenArchiveForUpdateEx_stub(LPCSTR lpFileName, DWORD dwFlags, DWORD dwMaximumFilesInArchive, DWORD dwBlockSize)
368{
369 LoadSFMpqDll();
370 if (hSFMpq) {
371 *(FARPROC *)&MpqOpenArchiveForUpdateEx = GetProcAddress(hSFMpq,"MpqOpenArchiveForUpdateEx");
372 if (MpqOpenArchiveForUpdateEx) return MpqOpenArchiveForUpdateEx(lpFileName,dwFlags,dwMaximumFilesInArchive,dwBlockSize);
373 }
374 return INVALID_HANDLE_VALUE;
375}
376
7df24e1f 377BOOL WINAPI MpqAddFileToArchiveEx_stub(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel)
378{
379 LoadSFMpqDll();
380 if (hSFMpq) {
381 *(FARPROC *)&MpqAddFileToArchiveEx = GetProcAddress(hSFMpq,"MpqAddFileToArchiveEx");
382 if (MpqAddFileToArchiveEx) return MpqAddFileToArchiveEx(hMPQ,lpSourceFileName,lpDestFileName,dwFlags,dwCompressionType,dwCompressLevel);
383 }
384 return FALSE;
385}
386
387BOOL WINAPI MpqAddFileFromBufferEx_stub(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel)
388{
389 LoadSFMpqDll();
390 if (hSFMpq) {
391 *(FARPROC *)&MpqAddFileFromBufferEx = GetProcAddress(hSFMpq,"MpqAddFileFromBufferEx");
392 if (MpqAddFileFromBufferEx) return MpqAddFileFromBufferEx(hMPQ,lpBuffer,dwLength,lpFileName,dwFlags,dwCompressionType,dwCompressLevel);
393 }
394 return FALSE;
395}
396
397BOOL WINAPI MpqAddFileFromBuffer_stub(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags)
398{
399 LoadSFMpqDll();
400 if (hSFMpq) {
401 *(FARPROC *)&MpqAddFileFromBuffer = GetProcAddress(hSFMpq,"MpqAddFileFromBuffer");
402 if (MpqAddFileFromBuffer) return MpqAddFileFromBuffer(hMPQ,lpBuffer,dwLength,lpFileName,dwFlags);
403 }
404 return FALSE;
405}
406
407BOOL WINAPI MpqAddWaveFromBuffer_stub(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwQuality)
408{
409 LoadSFMpqDll();
410 if (hSFMpq) {
411 *(FARPROC *)&MpqAddWaveFromBuffer = GetProcAddress(hSFMpq,"MpqAddWaveFromBuffer");
412 if (MpqAddWaveFromBuffer) return MpqAddWaveFromBuffer(hMPQ,lpBuffer,dwLength,lpFileName,dwFlags,dwQuality);
413 }
414 return FALSE;
415}
416
417BOOL WINAPI MpqRenameAndSetFileLocale_stub(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName, LCID nOldLocale, LCID nNewLocale)
418{
419 LoadSFMpqDll();
420 if (hSFMpq) {
421 *(FARPROC *)&MpqRenameAndSetFileLocale = GetProcAddress(hSFMpq,"MpqRenameAndSetFileLocale");
422 if (MpqRenameAndSetFileLocale) return MpqRenameAndSetFileLocale(hMPQ,lpcOldFileName,lpcNewFileName,nOldLocale,nNewLocale);
423 }
424 return FALSE;
425}
426
427BOOL WINAPI MpqDeleteFileWithLocale_stub(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nLocale)
428{
429 LoadSFMpqDll();
430 if (hSFMpq) {
431 *(FARPROC *)&MpqDeleteFileWithLocale = GetProcAddress(hSFMpq,"MpqDeleteFileWithLocale");
432 if (MpqDeleteFileWithLocale) return MpqDeleteFileWithLocale(hMPQ,lpFileName,nLocale);
433 }
434 return FALSE;
435}
436
437BOOL WINAPI MpqSetFileLocale_stub(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nOldLocale, LCID nNewLocale)
438{
439 LoadSFMpqDll();
440 if (hSFMpq) {
441 *(FARPROC *)&MpqSetFileLocale = GetProcAddress(hSFMpq,"MpqSetFileLocale");
442 if (MpqSetFileLocale) return MpqSetFileLocale(hMPQ,lpFileName,nOldLocale,nNewLocale);
443 }
444 return FALSE;
445}
446
447BOOL WINAPI SFileDestroy_stub()
448{
449 LoadSFMpqDll();
450 if (hSFMpq) {
451 *(FARPROC *)&SFileDestroy = GetProcAddress(hSFMpq,"SFileDestroy");
452 if (SFileDestroy) return SFileDestroy();
453 }
454 return FALSE;
455}
456
457void WINAPI StormDestroy_stub()
458{
459 LoadSFMpqDll();
460 if (hSFMpq) {
461 *(FARPROC *)&StormDestroy = GetProcAddress(hSFMpq,"StormDestroy");
462 if (StormDestroy) StormDestroy();
463 }
464}
465
466BOOL (WINAPI* MpqInitialize)() = MpqInitialize_stub;
467
468LPCSTR (WINAPI* MpqGetVersionString)() = MpqGetVersionString_stub;
469float (WINAPI* MpqGetVersion)() = MpqGetVersion_stub;
470
471void (WINAPI* SFMpqDestroy)() = SFMpqDestroy_stub;
472
473void (WINAPI* AboutSFMpq)() = AboutSFMpq_stub;
474
475LPCSTR (WINAPI* SFMpqGetVersionString)() = SFMpqGetVersionString_stub;
476DWORD (WINAPI* SFMpqGetVersionString2)(LPCSTR lpBuffer, DWORD dwBufferLength) = SFMpqGetVersionString2_stub;
477SFMPQVERSION (WINAPI* SFMpqGetVersion)() = SFMpqGetVersion_stub;
478
479BOOL (WINAPI* SFileOpenArchive)(LPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ) = SFileOpenArchive_stub;
480BOOL (WINAPI* SFileCloseArchive)(MPQHANDLE hMPQ) = SFileCloseArchive_stub;
481BOOL (WINAPI* SFileOpenFileAsArchive)(MPQHANDLE hSourceMPQ, LPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ) = SFileOpenFileAsArchive_stub;
482BOOL (WINAPI* SFileGetArchiveName)(MPQHANDLE hMPQ, LPCSTR lpBuffer, DWORD dwBufferLength) = SFileGetArchiveName_stub;
483BOOL (WINAPI* SFileOpenFile)(LPCSTR lpFileName, MPQHANDLE *hFile) = SFileOpenFile_stub;
484BOOL (WINAPI* SFileOpenFileEx)(MPQHANDLE hMPQ, LPCSTR lpFileName, DWORD dwSearchScope, MPQHANDLE *hFile) = SFileOpenFileEx_stub;
485BOOL (WINAPI* SFileCloseFile)(MPQHANDLE hFile) = SFileCloseFile_stub;
486DWORD (WINAPI* SFileGetFileSize)(MPQHANDLE hFile, LPDWORD lpFileSizeHigh) = SFileGetFileSize_stub;
487BOOL (WINAPI* SFileGetFileArchive)(MPQHANDLE hFile, MPQHANDLE *hMPQ) = SFileGetFileArchive_stub;
488BOOL (WINAPI* SFileGetFileName)(MPQHANDLE hFile, LPCSTR lpBuffer, DWORD dwBufferLength) = SFileGetFileName_stub;
489DWORD (WINAPI* SFileSetFilePointer)(MPQHANDLE hFile, long lDistanceToMove, PLONG lplDistanceToMoveHigh, DWORD dwMoveMethod) = SFileSetFilePointer_stub;
490BOOL (WINAPI* SFileReadFile)(MPQHANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped) = SFileReadFile_stub;
491LCID (WINAPI* SFileSetLocale)(LCID nNewLocale) = SFileSetLocale_stub;
492BOOL (WINAPI* SFileGetBasePath)(LPCSTR lpBuffer, DWORD dwBufferLength) = SFileGetBasePath_stub;
493BOOL (WINAPI* SFileSetBasePath)(LPCSTR lpNewBasePath) = SFileSetBasePath_stub;
494
495DWORD (WINAPI* SFileGetFileInfo)(MPQHANDLE hFile, DWORD dwInfoType) = SFileGetFileInfo_stub;
496BOOL (WINAPI* SFileSetArchivePriority)(MPQHANDLE hMPQ, DWORD dwPriority) = SFileSetArchivePriority_stub;
497DWORD (WINAPI* SFileFindMpqHeader)(HANDLE hFile) = SFileFindMpqHeader_stub;
498BOOL (WINAPI* SFileListFiles)(MPQHANDLE hMPQ, LPCSTR lpFileLists, FILELISTENTRY *lpListBuffer, DWORD dwFlags) = SFileListFiles_stub;
499
500MPQHANDLE (WINAPI* MpqOpenArchiveForUpdate)(LPCSTR lpFileName, DWORD dwFlags, DWORD dwMaximumFilesInArchive) = MpqOpenArchiveForUpdate_stub;
501DWORD (WINAPI* MpqCloseUpdatedArchive)(MPQHANDLE hMPQ, DWORD dwUnknown2) = MpqCloseUpdatedArchive_stub;
502BOOL (WINAPI* MpqAddFileToArchive)(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags) = MpqAddFileToArchive_stub;
503BOOL (WINAPI* MpqAddWaveToArchive)(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwQuality) = MpqAddWaveToArchive_stub;
504BOOL (WINAPI* MpqRenameFile)(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName) = MpqRenameFile_stub;
505BOOL (WINAPI* MpqDeleteFile)(MPQHANDLE hMPQ, LPCSTR lpFileName) = MpqDeleteFile_stub;
506BOOL (WINAPI* MpqCompactArchive)(MPQHANDLE hMPQ) = MpqCompactArchive_stub;
507
a9771b7c 508MPQHANDLE (WINAPI* MpqOpenArchiveForUpdateEx)(LPCSTR lpFileName, DWORD dwFlags, DWORD dwMaximumFilesInArchive, DWORD dwBlockSize) = MpqOpenArchiveForUpdateEx_stub;
7df24e1f 509BOOL (WINAPI* MpqAddFileToArchiveEx)(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel) = MpqAddFileToArchiveEx_stub;
510BOOL (WINAPI* MpqAddFileFromBufferEx)(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel) = MpqAddFileFromBufferEx_stub;
511BOOL (WINAPI* MpqAddFileFromBuffer)(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags) = MpqAddFileFromBuffer_stub;
512BOOL (WINAPI* MpqAddWaveFromBuffer)(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwQuality) = MpqAddWaveFromBuffer_stub;
513BOOL (WINAPI* MpqRenameAndSetFileLocale)(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName, LCID nOldLocale, LCID nNewLocale) = MpqRenameAndSetFileLocale_stub;
514BOOL (WINAPI* MpqDeleteFileWithLocale)(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nLocale) = MpqDeleteFileWithLocale_stub;
515BOOL (WINAPI* MpqSetFileLocale)(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nOldLocale, LCID nNewLocale) = MpqSetFileLocale_stub;
516
517BOOL (WINAPI* SFileDestroy)() = SFileDestroy_stub;
518void (WINAPI* StormDestroy)() = StormDestroy_stub;
519
520#ifndef SFMPQAPI_DELAY_LOAD
521SFMPQAPI_DELAY_LOADER::SFMPQAPI_DELAY_LOADER()
522{
523 LoadSFMpqDll();
524}
525#endif
526
527SFMPQAPI_DELAY_LOADER::~SFMPQAPI_DELAY_LOADER()
528{
529 MpqInitialize = 0;
530
531 MpqGetVersionString = 0;
532 MpqGetVersion = 0;
533
534 AboutSFMpq = 0;
535
536 SFMpqGetVersionString = 0;
537 SFMpqGetVersionString2 = 0;
538 SFMpqGetVersion = 0;
539
540 SFileOpenArchive = 0;
541 SFileCloseArchive = 0;
542 SFileOpenFileAsArchive = 0;
543 SFileGetArchiveName = 0;
544 SFileOpenFile = 0;
545 SFileOpenFileEx = 0;
546 SFileCloseFile = 0;
547 SFileGetFileSize = 0;
548 SFileGetFileArchive = 0;
549 SFileGetFileName = 0;
550 SFileSetFilePointer = 0;
551 SFileReadFile = 0;
552 SFileSetLocale = 0;
553 SFileGetBasePath = 0;
554 SFileSetBasePath = 0;
555
556 SFileGetFileInfo = 0;
557 SFileSetArchivePriority = 0;
558 SFileFindMpqHeader = 0;
559 SFileListFiles = 0;
560
561 MpqOpenArchiveForUpdate = 0;
562 MpqCloseUpdatedArchive = 0;
563 MpqAddFileToArchive = 0;
564 MpqAddWaveToArchive = 0;
565 MpqRenameFile = 0;
566 MpqDeleteFile = 0;
567 MpqCompactArchive = 0;
568
a9771b7c 569 MpqOpenArchiveForUpdateEx = 0;
7df24e1f 570 MpqAddFileToArchiveEx = 0;
571 MpqAddFileFromBufferEx = 0;
572 MpqAddFileFromBuffer = 0;
573 MpqAddWaveFromBuffer = 0;
574 MpqRenameAndSetFileLocale = 0;
575 MpqDeleteFileWithLocale = 0;
576 MpqSetFileLocale = 0;
577
578 SFileDestroy = 0;
579 StormDestroy = 0;
580
581 if (hSFMpq==0) return;
582 if (SFMpqDestroy!=0) SFMpqDestroy();
583
584 SFMpqDestroy = 0;
585
586 FreeLibrary(hSFMpq);
587 hSFMpq = 0;
588}
589
590long SFMpqCompareVersion()
591{
592 SFMPQVERSION ExeVersion = {1,0,8,1};
593 SFMPQVERSION DllVersion = SFMpqGetVersion();
594 if (DllVersion.Major>ExeVersion.Major) return 1;
595 else if (DllVersion.Major<ExeVersion.Major) return -1;
596 if (DllVersion.Minor>ExeVersion.Minor) return 1;
597 else if (DllVersion.Minor<ExeVersion.Minor) return -1;
598 if (DllVersion.Revision>ExeVersion.Revision) return 1;
599 else if (DllVersion.Revision<ExeVersion.Revision) return -1;
600 if (DllVersion.Subrevision>ExeVersion.Subrevision) return 1;
601 else if (DllVersion.Subrevision<ExeVersion.Subrevision) return -1;
602 return 0;
603}
604