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




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;