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
09d0556c 1/*
2 Storm.cpp
3*/
f15b049d 4/* License information for this code is in license.txt */
09d0556c 5
6#include "storm.h"
7
8struct STORMMODULE {
9 STORMMODULE();
10 ~STORMMODULE();
11} Storm;
12
f15b049d 13void LoadStormFunctions();
09d0556c 14void FreeStorm();
15
16HINSTANCE hStorm = 0;
17BOOL AlreadyLoaded = FALSE;
18
19// Storm Function Names
f15b049d 20BOOL (WINAPI* SFileOpenArchive)(LPCSTR lpFilename, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ) = 0;
21BOOL (WINAPI* SFileCloseArchive)(MPQHANDLE hMPQ) = 0;
22BOOL (WINAPI* SFileOpenFile)(LPCSTR lpFileName, MPQHANDLE *hFile) = 0;
23BOOL (WINAPI* SFileOpenFileEx)(MPQHANDLE hMPQ, LPCSTR lpFileName, DWORD dwSearchScope, MPQHANDLE *hFile) = 0;
24BOOL (WINAPI* SFileCloseFile)(MPQHANDLE hFile) = 0;
25DWORD (WINAPI* SFileGetFileSize)(MPQHANDLE hFile, LPDWORD lpFileSizeHigh) = 0;
26DWORD (WINAPI* SFileSetFilePointer)(MPQHANDLE hFile, long lDistanceToMove, PLONG lplDistanceToMoveHigh, DWORD dwMoveMethod) = 0;
27BOOL (WINAPI* SFileReadFile)(MPQHANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) = 0;
28LCID (WINAPI* SFileSetLocale)(LCID nNewLocale) = 0;
29BOOL (WINAPI* SFileDestroy)() = 0;
30BOOL (WINAPI* SFileGetArchiveName)(MPQHANDLE hMPQ, LPCSTR lpBuffer, DWORD dwBufferLength) = 0;
31BOOL (WINAPI* SFileGetFileName)(MPQHANDLE hFile, LPCSTR lpBuffer, DWORD dwBufferLength) = 0;
32BOOL (WINAPI* SFileGetFileArchive)(MPQHANDLE hFile, MPQHANDLE *hMPQ) = 0;
33BOOL (WINAPI* SFileGetBasePath)(LPCSTR lpBuffer, DWORD dwBufferLength) = 0;
34BOOL (WINAPI* SFileSetBasePath)(LPCSTR lpNewBasePath) = 0;
09d0556c 35
36STORMMODULE::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
48STORMMODULE::~STORMMODULE()
49{
50 FreeStorm();
51}
52
53HINSTANCE 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 67void 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 89void 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}