BSOne.SFC/Tocsg.Module/FasooDRM/EXE_bs1fsg/Tocsg.Fasoo.Global.pas

171 lines
5.5 KiB
Plaintext

{*******************************************************}
{ }
{ Tocsg.Fasoo.Global }
{ }
{ Copyright (C) 2025 kku }
{ }
{*******************************************************}
unit Tocsg.Fasoo.Global;
interface
uses
System.SysUtils, Winapi.Windows;
const
DLL_FSG_NAME = 'FasooPackagerADK_DLL.dll';
FASOO_OK = 0;
// Error
FASOO_INVALID_PARAM = 4;
FASOO_FILE_NOT_EXIST = 20;
FASOO_FILE_SIZE_ZERO = 21;
// Etc
FASOO_PACKAGED_FILE = 26;
FASOO_NOT_PACKAGED_FILE = 29;
FASOO_MARKANY_PACKAGED_FILE = 101;
FASOO_FSN_PACKAGED_FILE = 103;
FASOO_INCAPS_PACKAGED_FILE = 104;
FASOO_WRAPSODY_PACKAGED_FILE = 105;
FASOO_NX10_PACKAGED_FILE = 106;
type
TWorkPackager_new = function: Pointer; stdcall;
TWorkPackager_clear_all = procedure(pk: Pointer); stdcall;
TGetFileType_r = function(sEncPath: PAnsiChar): Integer; stdcall;
TGetFileTypeW_r = function(pk: Pointer; sEncPath: PAnsiChar): Integer; stdcall;
TSetOverWriteFlag = procedure(pk: Pointer; nFlag: Integer); stdcall;
TGetFileHeader_r = function(pk: Pointer; sEncPath: PAnsiChar): PAnsiChar; stdcall;
TGetFileHeaderW_r = function(pk: Pointer; sEncPath: PAnsiChar): PWideChar; stdcall;
TDoExtract_r = function(pk: Pointer; sHomeDir, sServerID, sEncPath, sDecPath: PAnsiChar): Integer; stdcall;
//function WorkPackager_new: Pointer;
//procedure WorkPackager_clear_all(pk: Pointer);
function InitFasooGlobalProcedure: Boolean;
function GetFileType_r(sEncPath: String): Integer;
function GetFileTypeW_r(sEncPath: String): Integer;
procedure SetOverWriteFlag(nFlag: Integer);
function GetFileHeader_r(sEncPath: String): String;
function GetFileHeaderW_r(sEncPath: String): String;
function DoExtract_r(sHomeDir, sServerID, sEncPath, sDecPath: String): Integer;
implementation
uses
Tocsg.Path, Tocsg.Trace;
var
_pk: Pointer = nil;
_fnWorkPackager_new: TWorkPackager_new = nil;
_fnWorkPackager_clear_all: TWorkPackager_clear_all = nil;
_fnGetFileType_r: TGetFileType_r = nil;
_fnGetFileTypeW_r: TGetFileTypeW_r = nil;
_fnSetOverWriteFlag: TSetOverWriteFlag = nil;
_fnGetFileHeader_r: TGetFileHeader_r = nil;
_fnGetFileHeaderW_r: TGetFileHeaderW_r = nil;
_fnDoExtract_r: TDoExtract_r = nil;
function InitFasooGlobalProcedure: Boolean;
var
hFs: THandle;
sDllPath: String;
begin
if _pk = nil then
begin
sDllPath := GetRunExePathDir + DLL_FSG_NAME;
if not FileExists(sDllPath) then
sDllPath := GetRunExePathDir + 'conf\' + DLL_FSG_NAME;
if FileExists(sDllPath) then
begin
hFs := LoadLibrary(PChar(sDllPath));
if hFs <> 0 then
begin
@_fnWorkPackager_new := GetProcAddress(hFs, 'WorkPackager_new');
@_fnWorkPackager_clear_all := GetProcAddress(hFs, 'WorkPackager_clear_all');
@_fnGetFileType_r := GetProcAddress(hFs, 'GetFileType_r');
@_fnGetFileTypeW_r := GetProcAddress(hFs, 'GetFileTypeW_r');
@_fnSetOverWriteFlag := GetProcAddress(hFs, 'SetOverWriteFlag');
@_fnGetFileHeader_r := GetProcAddress(hFs, 'GetFileHeader_r');
@_fnGetFileHeaderW_r := GetProcAddress(hFs, 'GetFileHeaderW_r');
@_fnDoExtract_r := GetProcAddress(hFs, 'DoExtract_r');
if Assigned(_fnWorkPackager_new) then
_pk := _fnWorkPackager_new;
end;
end;
end;
Result := _pk <> nil;
end;
function WorkPackager_new: Pointer;
begin
if InitFasooGlobalProcedure and Assigned(_fnWorkPackager_new) then
Result := _fnWorkPackager_new
else Result := nil;
end;
procedure WorkPackager_clear_all(pk: Pointer);
begin
if pk = nil then
exit;
if InitFasooGlobalProcedure and Assigned(_fnWorkPackager_clear_all) then
_fnWorkPackager_clear_all(pk);
end;
function GetFileType_r(sEncPath: String): Integer;
begin
if InitFasooGlobalProcedure and Assigned(_fnGetFileType_r) then
Result := _fnGetFileType_r(PAnsiChar(AnsiString(sEncPath)))
else Result := -1;
end;
function GetFileTypeW_r(sEncPath: String): Integer;
begin
if InitFasooGlobalProcedure and Assigned(_fnGetFileTypeW_r) then
Result := _fnGetFileTypeW_r(_pk, PAnsiChar(AnsiString(sEncPath)))
else Result := -1;
end;
// Target 파일이 존재할 경우 덮어쓰기 유무 설정
// 0: 덮어쓰지 않음, 1: 덮어씀
procedure SetOverWriteFlag(nFlag: Integer);
begin
if InitFasooGlobalProcedure and Assigned(_fnSetOverWriteFlag) then
_fnSetOverWriteFlag(_pk, nFlag);
end;
function GetFileHeader_r(sEncPath: String): String;
begin
if InitFasooGlobalProcedure and Assigned(_fnGetFileHeader_r) then
Result := AnsiString(_fnGetFileHeader_r(_pk, PAnsiChar(AnsiString(sEncPath))))
else Result := '';
end;
function GetFileHeaderW_r(sEncPath: String): String;
begin
if InitFasooGlobalProcedure and Assigned(_fnGetFileHeaderW_r) then
Result := _fnGetFileHeaderW_r(_pk, PAnsiChar(AnsiString(sEncPath)))
else Result := '';
end;
function DoExtract_r(sHomeDir, sServerID, sEncPath, sDecPath: String): Integer;
begin
if InitFasooGlobalProcedure and Assigned(_fnDoExtract_r) then
Result := _fnDoExtract_r(_pk, PAnsiChar(AnsiString(sHomeDir)), PAnsiChar(AnsiString(sServerID)),
PAnsiChar(AnsiString(sEncPath)), PAnsiChar(AnsiString(sDecPath)))
else Result := -1;
end;
end.
finalization
if (_pk <> nil) and Assigned(WorkPackager_clear_all) then
begin
WorkPackager_clear_all(_pk);
_pk := nil;
end;