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




ShadowFlare [Sun, 25 Oct 2009 13:09:32 +0000 (07:09 -0600)]
MpqStuff.bas
SFmpqapi.bas

index 439ceee..93586f3 100644 (file)
@@ -63,14 +63,7 @@ Public Const WM_SETREDRAW As Long = &HB
 Public Const WM_PAINT  As Long = &HF\r
 Const gintMAX_SIZE% = 255\r
 Public Const SEE_MASK_CLASSNAME As Long = &H1\r
-Sub AboutSFMpq()\r
-Dim AboutPage As String, Path As String\r
-Path = App.Path\r
-If Right(Path, 1) <> "\" Then Path = Path + "\"\r
-AboutPage = Path + "sfmpq.dll"\r
-If Not FileExists(AboutPage) Then AboutPage = "sfmpq.dll"\r
-ShellExecute 0, vbNullString, "res://" + AboutPage + "/about", vbNullString, vbNullString, 1\r
-End Sub\r
+\r
 Sub GetCompressFlags(File As String, ByRef cType As Integer, ByRef dwFlags As Long)\r
 Dim bNum As Long, fExt As String\r
 dwFlags = MAFA_REPLACE_EXISTING\r
index 15866f2..135656b 100644 (file)
@@ -1,7 +1,9 @@
 Attribute VB_Name = "SFmpqapi"\r
 Option Explicit\r
 \r
-'  ShadowFlare MPQ API Library. (c) ShadowFlare Software 2002\r
+'  ShadowFlare MPQ API Library. (c) ShadowFlare Software 2002-2009\r
+'  License information for this code is in license.txt and\r
+'  included in this file at the end of this comment.\r
 \r
 '  All functions below are actual functions that are part of this\r
 '  library and do not need any additional dll files.  It does not\r
@@ -21,6 +23,23 @@ Option Explicit
 '  most likely result in a crash.\r
 \r
 '  Revision History:\r
+'  (Release date) 1.08 (ShadowFlare)\r
+'  - Fixed a buffer overflow that would occur when reading files\r
+'    if neither using a buffer that is large enough to contain the\r
+'    entire file nor has a size that is a multiple of 4096\r
+'  - Added SFileOpenFileAsArchive which opens an archive that is\r
+'    contained within an already open archive\r
+'  - Added MpqRenameAndSetFileLocale and MpqDeleteFileWithLocale.\r
+'    These have extra parameters that allow you to use them with\r
+'    files having language codes other than what was last set\r
+'    using SFileSetLocale\r
+'  - Fixed a bug that caused (listfile) to get cleared if adding\r
+'    files with a locale ID other than 0\r
+'  - Added MpqOpenArchiveForUpdateEx which allows creating\r
+'    archives with different block sizes\r
+'  - SFileListFiles can list the contents of bncache.dat without\r
+'    needing an external list\r
+\r
 '  06/12/2002 1.07 (ShadowFlare)\r
 '  - No longer requires Storm.dll to compress or decompress\r
 '    Warcraft III files\r
@@ -107,18 +126,35 @@ Option Explicit
 '    errors that have to do with this library\r
 '  - MpqCompactArchive not implemented\r
 \r
-'  This library is freeware, you can do anything you want with it but with\r
-'  one exception.  If you use it in your program, you must specify this fact\r
-'  in Help|About box or in similar way.  You can obtain version string using\r
-'  SFMpqGetVersionString call.\r
-\r
-'  THIS LIBRARY IS DISTRIBUTED "AS IS".  NO WARRANTY OF ANY KIND IS EXPRESSED\r
-'  OR IMPLIED. YOU USE AT YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR\r
-'  DATA LOSS, DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING\r
-'  OR MISUSING THIS SOFTWARE.\r
-\r
 '  Any comments or suggestions are accepted at blakflare@hotmail.com (ShadowFlare)\r
 \r
+'  License information:\r
+\r
+'  Copyright (c) 2002-2009, ShadowFlare <blakflare@hotmail.com>\r
+'  All rights reserved.\r
+\r
+'  Redistribution and use in source and binary forms, with or without\r
+'  modification, are permitted provided that the following conditions\r
+'  are met:\r
+\r
+'  1. Redistributions of source code must retain the above copyright\r
+'     notice, this list of conditions and the following disclaimer.\r
+'  2. Redistributions in binary form must reproduce the above copyright\r
+'     notice, this list of conditions and the following disclaimer in the\r
+'     documentation and/or other materials provided with the distribution.\r
+\r
+'  THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND\r
+'  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+'  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+'  ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+'  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+'  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+'  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+'  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+'  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+'  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+'  SUCH DAMAGE.\r
+\r
 Type SFMPQVERSION\r
     Major As Integer\r
     Minor As Integer\r
@@ -135,6 +171,8 @@ Declare Function MpqGetVersion Lib "SFmpq.dll" () As Single
 \r
 Declare Sub SFMpqDestroy Lib "SFmpq.dll" () ' This no longer needs to be called.  It is only provided for compatibility with older versions\r
 \r
+Declare Sub AboutSFMpq Lib "SFmpq.dll" () ' Displays an about page in a web browser (this has only been tested in Internet Explorer). This is only for the dll version of SFmpq\r
+\r
 ' SFMpqGetVersionString2's return value is the required length of the buffer plus\r
 ' the terminating null, so use SFMpqGetVersionString2(ByVal 0&, 0) to get the length.\r
 Declare Function SFMpqGetVersionString Lib "SFmpq.dll" () As String\r
@@ -157,6 +195,7 @@ Public Const MOAU_CREATE_ALWAYS As Long = &H8 'Was wrongly named MOAU_CREATE_NEW
 Public Const MOAU_OPEN_EXISTING As Long = &H4\r
 Public Const MOAU_OPEN_ALWAYS As Long = &H20\r
 Public Const MOAU_READ_ONLY As Long = &H10 'Must be used with MOAU_OPEN_EXISTING\r
+Public Const MOAU_MAINTAIN_ATTRIBUTES As Long = &H2 'Will be used in a future version to create the (attributes) file\r
 Public Const MOAU_MAINTAIN_LISTFILE As Long = &H1\r
 \r
 ' MpqOpenArchiveForUpdateEx constants\r
@@ -208,14 +247,17 @@ Public Const SFILE_INFO_POSITION As Long = &H9 'Position of file pointer in file
 Public Const SFILE_INFO_LOCALEID As Long = &HA 'Locale ID of file in MPQ\r
 Public Const SFILE_INFO_PRIORITY As Long = &HB 'Priority of open MPQ\r
 Public Const SFILE_INFO_HASH_INDEX As Long = &HC 'Hash index of file in MPQ\r
+Public Const SFILE_INFO_BLOCK_INDEX As Long = &HD 'Block table index of file in MPQ\r
+\r
+' Return values of SFileGetFileInfo when SFILE_INFO_TYPE flag is used\r
+Public Const SFILE_TYPE_MPQ As Long = &H1\r
+Public Const SFILE_TYPE_FILE As Long = &H2\r
 \r
 ' SFileListFiles flags\r
 Public Const SFILE_LIST_MEMORY_LIST  As Long = &H1 ' Specifies that lpFilelists is a file list from memory, rather than being a list of file lists\r
 Public Const SFILE_LIST_ONLY_KNOWN   As Long = &H2 ' Only list files that the function finds a name for\r
 Public Const SFILE_LIST_ONLY_UNKNOWN As Long = &H4 ' Only list files that the function does not find a name for\r
-\r
-Public Const SFILE_TYPE_MPQ As Long = &H1\r
-Public Const SFILE_TYPE_FILE As Long = &H2\r
+Public Const SFILE_LIST_FLAG_UNKNOWN As Long = &H8 ' Use without SFILE_LIST_ONLY_KNOWN or SFILE_LIST_FLAG_UNKNOWN to list all files, but will set dwFileExists to 3 if file's name is not found\r
 \r
 Public Const INVALID_HANDLE_VALUE As Long = -1\r
 \r
@@ -223,10 +265,12 @@ Public Const FILE_BEGIN   As Long = 0
 Public Const FILE_CURRENT As Long = 1\r
 Public Const FILE_END     As Long = 2\r
 \r
+' SFileOpenArchive flags\r
 Public Const SFILE_OPEN_HARD_DISK_FILE As Long = &H0 'Open archive without regard to the drive type it resides on\r
 Public Const SFILE_OPEN_CD_ROM_FILE As Long = &H1 'Open the archive only if it is on a CD-ROM\r
 Public Const SFILE_OPEN_ALLOW_WRITE As Long = &H8000 'Open file with write access\r
 \r
+' SFileOpenFileEx search scopes\r
 Public Const SFILE_SEARCH_CURRENT_ONLY As Long = &H0 'Used with SFileOpenFileEx; only the archive with the handle specified will be searched for the file\r
 Public Const SFILE_SEARCH_ALL_OPEN As Long = &H1 'SFileOpenFileEx will look through all open archives for the file\r
 \r
@@ -242,6 +286,7 @@ End Type
 ' Storm functions implemented by this library\r
 Declare Function SFileOpenArchive Lib "SFmpq.dll" (ByVal lpFileName As String, ByVal dwPriority As Long, ByVal dwFlags As Long, ByRef hMPQ As Long) As Boolean\r
 Declare Function SFileCloseArchive Lib "SFmpq.dll" (ByVal hMPQ As Long) As Boolean\r
+Declare Function SFileOpenFileAsArchive Lib "SFmpq.dll" (ByVal hSourceMPQ As Long, ByVal lpFileName As String, ByVal dwPriority As Long, ByVal dwFlags As Long, ByRef hMPQ As Long) As Boolean\r
 Declare Function SFileGetArchiveName Lib "SFmpq.dll" (ByVal hMPQ As Long, ByVal lpBuffer As String, ByVal dwBufferLength As Long) As Boolean\r
 Declare Function SFileOpenFile Lib "SFmpq.dll" (ByVal lpFileName As String, ByRef hFile As Long) As Boolean\r
 Declare Function SFileOpenFileEx Lib "SFmpq.dll" (ByVal hMPQ As Long, ByVal lpFileName As String, ByVal dwSearchScope As Long, ByRef hFile As Long) As Boolean\r
@@ -276,6 +321,8 @@ Declare Function MpqAddFileToArchiveEx Lib "SFmpq.dll" (ByVal hMPQ As Long, ByVa
 Declare Function MpqAddFileFromBufferEx Lib "SFmpq.dll" (ByVal hMPQ As Long, ByRef lpBuffer As Any, ByVal dwLength As Long, ByVal lpFileName As String, ByVal dwFlags As Long, ByVal dwCompressionType As Long, ByVal dwCompressLevel As Long) As Boolean\r
 Declare Function MpqAddFileFromBuffer Lib "SFmpq.dll" (ByVal hMPQ As Long, ByRef lpBuffer As Any, ByVal dwLength As Long, ByVal lpFileName As String, ByVal dwFlags As Long) As Boolean\r
 Declare Function MpqAddWaveFromBuffer Lib "SFmpq.dll" (ByVal hMPQ As Long, ByRef lpBuffer As Any, ByVal dwLength As Long, ByVal lpFileName As String, ByVal dwFlags As Long, ByVal dwQuality As Long) As Boolean\r
+Declare Function MpqRenameAndSetFileLocale Lib "SFmpq.dll" (ByVal hMPQ As Long, ByVal lpcOldFileName As String, ByVal lpcNewFileName As String, ByVal nOldLocale As Long, ByVal nNewLocale As Long) As Boolean\r
+Declare Function MpqDeleteFileWithLocale Lib "SFmpq.dll" (ByVal hMPQ As Long, ByVal lpFileName As String, ByVal nLocale As Long) As Boolean\r
 Declare Function MpqSetFileLocale Lib "SFmpq.dll" (ByVal hMPQ As Long, ByVal lpFileName As String, ByVal nOldLocale As Long, ByVal nNewLocale As Long) As Boolean\r
 \r
 ' These functions do nothing.  They are only provided for\r
@@ -290,8 +337,8 @@ Function SFMpqCompareVersion() As Long
     With ExeVersion\r
         .Major = 1\r
         .Minor = 0\r
-        .Revision = 7\r
-        .Subrevision = 4\r
+        .Revision = 8\r
+        .Subrevision = 1\r
     End With\r
     DllVersion = SFMpqGetVersion()\r
     If DllVersion.Major > ExeVersion.Major Then\r