请选择 进入手机版 | 继续访问电脑版

中国星际RPG联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3966|回复: 1

不附加任何文件直接用C++调用Storm.dll

[复制链接]
发表于 2013-8-22 23:52:01 | 显示全部楼层 |阅读模式

  1. // stormlib.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include <windows.h>
  4. #include <iostream>
  5. typedef char * mLPCSTR;
  6. namespace _MPQ{
  7.     BOOL MPQInitialized = FALSE;
  8.     BOOL (WINAPI * SFileOpenArchive)(mLPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, HANDLE *hMPQ);
  9.     BOOL (WINAPI * SFileCloseArchive)(HANDLE hMPQ);
  10.     BOOL (WINAPI * SFileGetArchiveName)(HANDLE hMPQ, mLPCSTR lpBuffer, DWORD dwBufferLength);
  11.     BOOL (WINAPI * SFileOpenFile)(mLPCSTR lpFileName, HANDLE *hFile);
  12.     BOOL (WINAPI * SFileOpenFileEx)(HANDLE hMPQ, mLPCSTR lpFileName, DWORD dwSearchScope, HANDLE *hFile);
  13.     BOOL (WINAPI * SFileCloseFile)(HANDLE hFile);
  14.     DWORD (WINAPI * SFileGetFileSize)(HANDLE hFile, LPDWORD lpFileSizeHigh);
  15.     BOOL (WINAPI * SFileGetFileArchive)(HANDLE hFile, HANDLE *hMPQ);
  16.     BOOL (WINAPI * SFileGetFileName)(HANDLE hFile, mLPCSTR lpBuffer, DWORD dwBufferLength);
  17.     DWORD (WINAPI * SFileSetFilePointer)(HANDLE hFile, LONG lDistanceToMove, PLONG lplDistanceToMoveHigh, DWORD dwMoveMethod);
  18.     BOOL (WINAPI * SFileReadFile)(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped);
  19.     LCID (WINAPI * SFileSetLocale)(LCID nNewLocale);
  20.     BOOL (WINAPI * SFileGetBasePath)(mLPCSTR lpBuffer, DWORD dwBufferLength);
  21.     BOOL (WINAPI * SFileSetBasePath)(mLPCSTR lpNewBasePath);
  22.     BOOL (WINAPI * SFileDestroy)();
  23.     void MPQInitialize(void)
  24.     {
  25.         //Load storm.dll and set function
  26.         HMODULE stormdll;
  27.         stormdll = LoadLibraryA("storm.dll");
  28.         (FARPROC&)SFileCloseArchive = GetProcAddress(stormdll, (mLPCSTR)0x0FC);
  29.         (FARPROC&)SFileCloseFile = GetProcAddress(stormdll, (mLPCSTR)0x0FD);
  30.         (FARPROC&)SFileDestroy = GetProcAddress(stormdll, (mLPCSTR)0x106);
  31.         (FARPROC&)SFileGetFileArchive = GetProcAddress(stormdll, (mLPCSTR)0x108);
  32.         (FARPROC&)SFileGetFileSize = GetProcAddress(stormdll, (mLPCSTR)0x109);
  33.         (FARPROC&)SFileOpenArchive = GetProcAddress(stormdll, (mLPCSTR)0x10A);
  34.         (FARPROC&)SFileOpenFile = GetProcAddress(stormdll, (mLPCSTR)0x10B);
  35.         (FARPROC&)SFileOpenFileEx = GetProcAddress(stormdll, (mLPCSTR)0x10C);
  36.         (FARPROC&)SFileReadFile = GetProcAddress(stormdll, (mLPCSTR)0x10D);
  37.         (FARPROC&)SFileSetBasePath = GetProcAddress(stormdll, (mLPCSTR)0x10E);
  38.         (FARPROC&)SFileSetFilePointer = GetProcAddress(stormdll, (mLPCSTR)0x10F);
  39.         (FARPROC&)SFileSetLocale = GetProcAddress(stormdll, (mLPCSTR)0x110);
  40.         (FARPROC&)SFileGetBasePath = GetProcAddress(stormdll, (mLPCSTR)0x111);
  41.         (FARPROC&)SFileGetArchiveName = GetProcAddress(stormdll, (mLPCSTR)0x113);
  42.         (FARPROC&)SFileGetFileName = GetProcAddress(stormdll, (mLPCSTR)0x114);
  43.         /*
  44.             (FARPROC&)SFileSetLastError = GetProcAddress(stormdll, (mLPCSTR)0x1D1);
  45.             (FARPROC&)SFileCompress = GetProcAddress(stormdll, (mLPCSTR)0x227);
  46.             (FARPROC&)SFileDecompress = GetProcAddress(stormdll, (mLPCSTR)0x228);
  47.         */
  48.         SFileDestroy();
  49.         SFileSetLocale(0x656E5553);
  50.         MPQInitialized = TRUE;
  51.     }

  52.     BOOL MPQExtract(mLPCSTR MPQArchive, mLPCSTR MPQFile, mLPCSTR Path, BOOL UseMPQPath)
  53.     {
  54.         //3 method to use
  55.         //MPQExtract("d:\\UCD3.3.scx", "staredit\\scenario.chk", "d:\\", true);
  56.         //MPQExtract("d:\\UCD3.3.scx", "staredit\\scenario.chk", "d:\\", false);
  57.         //MPQExtract("d:\\UCD3.3.scx", "staredit\\scenario.chk", "d:\\scenario.chk", false);
  58.         HANDLE mpq,scenario;
  59.         DWORD filesize,readed;
  60.         BYTE * buffer;
  61.         FILE *f1;
  62.         BOOL usePathName;
  63.         mLPCSTR FileName = 0;
  64.         mLPCSTR FinalPath = 0;
  65.         if('\\' == Path[strlen(Path) - 1])
  66.         {
  67.             usePathName = FALSE;
  68.             FileName = (mLPCSTR)malloc(strlen(MPQFile) + 1);
  69.             if(UseMPQPath)
  70.                 strcpy(FileName, MPQFile);
  71.             else
  72.             {
  73.                 //getPathFileName(MPQFile, FileName);
  74.                 //void getPathFileName(mLPCSTR Path, mLPCSTR out)
  75.                 {
  76.                     DWORD len = strlen(MPQFile), l = len;
  77.                     while(l)
  78.                     {
  79.                         if('\\' == MPQFile[l])
  80.                             break;
  81.                         l--;
  82.                     }
  83.                     memmove(FileName, MPQFile + l + 1, len - l);
  84.                 }
  85.             }
  86.         }
  87.         else
  88.             usePathName = TRUE;
  89.         if(!MPQInitialized) MPQInitialize();
  90.         if(!SFileOpenArchive(MPQArchive, 0, 0, &mpq)) return FALSE;
  91.         if(!SFileOpenFileEx(mpq, MPQFile, 0, &scenario))
  92.         {
  93.             SFileCloseArchive(mpq);
  94.             return FALSE;
  95.         }
  96.         filesize = SFileGetFileSize(scenario, &readed);
  97.         buffer = (BYTE*)malloc(filesize);
  98.         if(!buffer)
  99.         {
  100.             SFileCloseFile(scenario);
  101.             SFileCloseArchive(mpq);
  102.             return FALSE;
  103.         }
  104.         if(!SFileReadFile(scenario, buffer, filesize, &readed, NULL))
  105.         {
  106.             SFileCloseFile(scenario);
  107.             SFileCloseArchive(mpq);
  108.             return FALSE;
  109.         }
  110.         SFileCloseFile(scenario);
  111.         SFileCloseArchive(mpq);
  112.         
  113.         if(usePathName)
  114.             f1 = fopen(Path, "wb");
  115.         else
  116.         {
  117.             FinalPath = (mLPCSTR)malloc(strlen(Path) + strlen(FileName) + 1);
  118.             strcpy(FinalPath, Path);
  119.             strcat(FinalPath, FileName);
  120.             //makedir(FinalPath);
  121.             //void makedir(mLPCSTR FinalPath)
  122.             {
  123.                 DWORD i = 1;
  124.                 DWORD len = strlen(FinalPath);
  125.                 mLPCSTR T = (mLPCSTR) malloc(len + 1);
  126.                 strcpy(T, FinalPath);
  127.                 while(i <= len)
  128.                 {
  129.                     if('\\' == FinalPath[i-1])
  130.                     {
  131.                         T[i] = 0;
  132.                         if(0xFFFFFFFF == GetFileAttributesA(T))
  133.                             CreateDirectoryA(T, NULL);
  134.                         T[i] = FinalPath[i];
  135.                     }
  136.                     i++;
  137.                 }
  138.             }
  139.             f1 = fopen(FinalPath, "wb");
  140.         }
  141.         if(!f1) return FALSE;
  142.         fwrite(buffer, filesize, 1, f1);
  143.         fclose(f1);
  144.         free(buffer);
  145.         if(FinalPath) free(FinalPath);
  146.         if(FileName) free(FileName);
  147.         return TRUE;
  148.     }
  149.     DWORD MPQGetFileSize(mLPCSTR MPQ, mLPCSTR MPQFile)
  150.     {
  151.         //get mpq file size
  152.         //Error return 0xFFFFFFFF
  153.         HANDLE mpq,scenario;
  154.         DWORD readed;
  155.         if(!MPQInitialized) MPQInitialize();
  156.         if(!SFileOpenArchive(MPQ, 0, 0, &mpq)) return 0xFFFFFFFF;
  157.         if(!SFileOpenFileEx(mpq, MPQFile, 0, &scenario))
  158.         {
  159.             SFileCloseArchive(mpq);
  160.             return 0xFFFFFFFF;
  161.         }
  162.         return SFileGetFileSize(scenario, &readed);
  163.     }
  164.     BOOL MPQReadFile(mLPCSTR MPQArchive, mLPCSTR MPQFile, void * Buffer, DWORD LengthOfBuffer)
  165.     {
  166.         //This function is used to extract MPQ file to memory
  167.         //buffer must be alloced before use this function
  168.         
  169.         HANDLE mpq,scenario;
  170.         DWORD filesize,readed;
  171.         BYTE * buffer;
  172.         if(!MPQInitialized) MPQInitialize();
  173.         if(!SFileOpenArchive(MPQArchive, 0, 0, &mpq)) return FALSE;
  174.         if(!SFileOpenFileEx(mpq, MPQFile, 0, &scenario))
  175.         {
  176.             SFileCloseArchive(mpq);
  177.             return FALSE;
  178.         }
  179.         filesize = SFileGetFileSize(scenario, &readed);
  180.         buffer = (BYTE *)Buffer;
  181.         if(LengthOfBuffer < filesize || !buffer)
  182.         {
  183.             SFileCloseFile(scenario);
  184.             SFileCloseArchive(mpq);
  185.             return FALSE;
  186.         }
  187.         if(!SFileReadFile(scenario, buffer, filesize, &readed, NULL))
  188.         {
  189.             SFileCloseFile(scenario);
  190.             SFileCloseArchive(mpq);
  191.             return FALSE;
  192.         }
  193.         SFileCloseFile(scenario);
  194.         SFileCloseArchive(mpq);
  195.         
  196.         return TRUE;
  197.     }

  198.     BOOL MPQFileExist(mLPCSTR MPQ, mLPCSTR MPQFile)
  199.     {
  200.         //Exist return TRUE
  201.         //Error or doesn`t exist return FALSE
  202.         HANDLE mpq,scenario;
  203.         DWORD readed;
  204.         if(!MPQInitialized) MPQInitialize();
  205.         if(!SFileOpenArchive(MPQ, 0, 0, &mpq)) return FALSE;
  206.         if(!SFileOpenFileEx(mpq, MPQFile, 0, &scenario))
  207.         {
  208.             SFileCloseArchive(mpq);
  209.             return FALSE;
  210.         }
  211.         return TRUE;
  212.     }
  213. };

  214. using namespace _MPQ;
  215. void main(void)
  216. {   
  217.     MPQExtract("d:\\UCD3.3.scx", "staredit\\scenario.chk", "d:\\", false);
  218. }

复制代码
回复

使用道具 举报

 楼主| 发表于 2013-8-23 00:37:10 | 显示全部楼层

Re:不附加任何文件直接用C++调用Storm.dll

windows.h 和 iostream 不算附加的
storm.dll只有解压类函数,没有提供打包函数
因此无法往MPQ里面写东西
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|网站统计|手机版|小黑屋|中国星际RPG联盟    

GMT+8, 2024-3-29 01:15 , Processed in 1.296900 second(s), 20 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表