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 Small banner for links to this site: |
4d73c820d2a049462f852722d084958218eef918
1 /*
2 Storm.cpp
3 */
4 /* License information for this code is in license.txt */
6 #include "storm.h"
8 struct STORMMODULE {
9 STORMMODULE();
10 ~STORMMODULE();
11 } Storm;
13 void LoadStormFunctions();
14 void FreeStorm();
16 HINSTANCE hStorm = 0;
17 BOOL AlreadyLoaded = FALSE;
19 // Storm Function Names
20 BOOL (WINAPI* SFileOpenArchive)(LPCSTR lpFilename, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ) = 0;
21 BOOL (WINAPI* SFileCloseArchive)(MPQHANDLE hMPQ) = 0;
22 BOOL (WINAPI* SFileOpenFile)(LPCSTR lpFileName, MPQHANDLE *hFile) = 0;
23 BOOL (WINAPI* SFileOpenFileEx)(MPQHANDLE hMPQ, LPCSTR lpFileName, DWORD dwSearchScope, MPQHANDLE *hFile) = 0;
24 BOOL (WINAPI* SFileCloseFile)(MPQHANDLE hFile) = 0;
25 DWORD (WINAPI* SFileGetFileSize)(MPQHANDLE hFile, LPDWORD lpFileSizeHigh) = 0;
26 DWORD (WINAPI* SFileSetFilePointer)(MPQHANDLE hFile, long lDistanceToMove, PLONG lplDistanceToMoveHigh, DWORD dwMoveMethod) = 0;
27 BOOL (WINAPI* SFileReadFile)(MPQHANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) = 0;
28 LCID (WINAPI* SFileSetLocale)(LCID nNewLocale) = 0;
29 BOOL (WINAPI* SFileDestroy)() = 0;
30 BOOL (WINAPI* SFileGetArchiveName)(MPQHANDLE hMPQ, LPCSTR lpBuffer, DWORD dwBufferLength) = 0;
31 BOOL (WINAPI* SFileGetFileName)(MPQHANDLE hFile, LPCSTR lpBuffer, DWORD dwBufferLength) = 0;
32 BOOL (WINAPI* SFileGetFileArchive)(MPQHANDLE hFile, MPQHANDLE *hMPQ) = 0;
33 BOOL (WINAPI* SFileGetBasePath)(LPCSTR lpBuffer, DWORD dwBufferLength) = 0;
34 BOOL (WINAPI* SFileSetBasePath)(LPCSTR lpNewBasePath) = 0;
36 STORMMODULE::STORMMODULE()
37 {
38 if (hStorm!=0) return;
39 const char STORM_DLL[] = "Storm.dll";
40 hStorm = GetModuleHandle(STORM_DLL);
41 if (hStorm == NULL) hStorm = LoadLibrary(STORM_DLL);
42 else AlreadyLoaded=TRUE;
44 LoadStormFunctions();
45 if (SFileDestroy && !AlreadyLoaded) SFileDestroy();
46 }
48 STORMMODULE::~STORMMODULE()
49 {
50 FreeStorm();
51 }
53 HINSTANCE LoadStorm(char * DllFileName)
54 {
55 FreeStorm();
56 if (hStorm!=0) return 0;
57 hStorm = GetModuleHandle(DllFileName);
58 if (hStorm == NULL) hStorm = LoadLibrary(DllFileName);
59 else AlreadyLoaded=TRUE;
61 LoadStormFunctions();
62 if (SFileDestroy && !AlreadyLoaded) SFileDestroy();
63 if (AlreadyLoaded==TRUE) return 0;
64 return hStorm;
65 }
67 void LoadStormFunctions()
68 {
69 if (hStorm != NULL)
70 {
71 *(FARPROC *)&SFileCloseArchive = GetProcAddress(hStorm, (LPCSTR)0xFC);
72 *(FARPROC *)&SFileCloseFile = GetProcAddress(hStorm, (LPCSTR)0xFD);
73 *(FARPROC *)&SFileDestroy = GetProcAddress(hStorm, (LPCSTR)0x106);
74 *(FARPROC *)&SFileGetFileArchive = GetProcAddress(hStorm, (LPCSTR)0x108);
75 *(FARPROC *)&SFileGetFileSize = GetProcAddress(hStorm, (LPCSTR)0x109);
76 *(FARPROC *)&SFileOpenArchive = GetProcAddress(hStorm, (LPCSTR)0x10A);
77 *(FARPROC *)&SFileOpenFile = GetProcAddress(hStorm, (LPCSTR)0x10B);
78 *(FARPROC *)&SFileOpenFileEx = GetProcAddress(hStorm, (LPCSTR)0x10C);
79 *(FARPROC *)&SFileReadFile = GetProcAddress(hStorm, (LPCSTR)0x10D);
80 *(FARPROC *)&SFileSetBasePath = GetProcAddress(hStorm, (LPCSTR)0x10E);
81 *(FARPROC *)&SFileSetFilePointer = GetProcAddress(hStorm, (LPCSTR)0x10F);
82 *(FARPROC *)&SFileSetLocale = GetProcAddress(hStorm, (LPCSTR)0x110);
83 *(FARPROC *)&SFileGetBasePath = GetProcAddress(hStorm, (LPCSTR)0x111);
84 *(FARPROC *)&SFileGetArchiveName = GetProcAddress(hStorm, (LPCSTR)0x113);
85 *(FARPROC *)&SFileGetFileName = GetProcAddress(hStorm, (LPCSTR)0x114);
86 }
87 }
89 void FreeStorm()
90 {
91 SFileCloseArchive = 0;
92 SFileCloseFile = 0;
93 SFileDestroy = 0;
94 SFileGetFileArchive = 0;
95 SFileGetFileSize = 0;
96 SFileOpenArchive = 0;
97 SFileOpenFile = 0;
98 SFileOpenFileEx = 0;
99 SFileReadFile = 0;
100 SFileSetBasePath = 0;
101 SFileSetFilePointer = 0;
102 SFileSetLocale = 0;
103 SFileGetBasePath = 0;
104 SFileGetArchiveName = 0;
105 SFileGetFileName = 0;
107 if (hStorm==0) return;
109 if (AlreadyLoaded==FALSE) FreeLibrary(hStorm);
110 hStorm = 0;
111 }
|