Commit | Line | Data |
09d0556c |
1 | /* |
2 | Storm.cpp |
3 | */ |
f15b049d |
4 | /* License information for this code is in license.txt */ |
09d0556c |
5 | |
6 | #include "storm.h" |
7 | |
8 | struct STORMMODULE { |
9 | STORMMODULE(); |
10 | ~STORMMODULE(); |
11 | } Storm; |
12 | |
f15b049d |
13 | void LoadStormFunctions(); |
09d0556c |
14 | void FreeStorm(); |
15 | |
16 | HINSTANCE hStorm = 0; |
17 | BOOL AlreadyLoaded = FALSE; |
18 | |
19 | // Storm Function Names |
f15b049d |
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; |
09d0556c |
35 | |
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; |
43 | |
f15b049d |
44 | LoadStormFunctions(); |
09d0556c |
45 | if (SFileDestroy && !AlreadyLoaded) SFileDestroy(); |
46 | } |
47 | |
48 | STORMMODULE::~STORMMODULE() |
49 | { |
50 | FreeStorm(); |
51 | } |
52 | |
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; |
60 | |
f15b049d |
61 | LoadStormFunctions(); |
09d0556c |
62 | if (SFileDestroy && !AlreadyLoaded) SFileDestroy(); |
63 | if (AlreadyLoaded==TRUE) return 0; |
64 | return hStorm; |
65 | } |
66 | |
f15b049d |
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 | } |
88 | |
09d0556c |
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; |
106 | |
107 | if (hStorm==0) return; |
108 | |
109 | if (AlreadyLoaded==FALSE) FreeLibrary(hStorm); |
110 | hStorm = 0; |
111 | } |