So ... start
In VisualSTUDIO Express go
File>NewProject>Teplates>Visual C#>Windows>WindowsFormAplication
enter name of project [Name of my proj is tutorials] > than ok
Change DEBUG to release
Add 3 listboxes from toolbox
Rename listbox1 to main [ design name ]
Rename listbox2 to sections [ design name ]
Rename lostbox3 to logbox [ design name ]
Select FORM go to events and double click load
and copy code below
- Code: Select all
private void Form1_Load(object sender, EventArgs e)
{
foreach (string s in nba2knames)
{
if (File.Exists(Directory.GetCurrentDirectory() + "\\" + s))
{
main.Items.Add(s);
}
else
{
}
}
}
for using part we use
- Code: Select all
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
above Form1Load insert
- Code: Select all
string[] nba2knames = File.ReadAllLines("2knames.txt"); //read file names
public static string moddingfolder = Directory.GetCurrentDirectory() + "\\ModdingFolder\\"; //modding folder for file export-import
string outputfolder = moddingfolder + "export\\"; //export folder in modding folder
byte[] iffscan = { 0x94, 0xEF, 0x3B, 0xFF }; //94EF3BFF is IFF header
byte[] pkzippattern = { 0x50, 0x4B, 0x03, 0x04 }; //504B0304 is PK Zip Header
byte[] zlibpattern05 = { 0x00, 0x05, 0x78, 0xDA }; // zlib pattern1
byte[] zlibpattern = { 0x00, 0x06, 0x78, 0xDA }; //zlib pattern2
List<long> pkchunkslist = new List<long>(new long[] { }); // list to store pkoffsets
long finalpkzipposs = 0;
public static int ToInt32BigEndian(byte[] buf, int i)
{
return (buf[i] << 24) | (buf[i + 1] << 16) | (buf[i + 2] << 8) | buf[i + 3];
}
MAIN BOX
under mainbox properties/events double click on SelectedIndexChanged
- Code: Select all
private void main_SelectedIndexChanged(object sender, EventArgs e)
{
if (main.SelectedIndex != -1)
{
sections.Items.Clear();
string fldr = outputfolder + main.SelectedItem.ToString();
if (Directory.Exists(fldr) == false)
{
Directory.CreateDirectory(outputfolder + main.SelectedItem.ToString());
}
Int64 read = 0;
FileInfo fi = new FileInfo(Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
long lo = fi.Length;
using (FileStream fs = new FileStream(Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString(), FileMode.Open, FileAccess.Read))
{
byte[] buf = new byte[1024 * 1024 * 400];
if (main.SelectedIndex != -1)
{
BinaryReader brxz = new BinaryReader(fs);
while (read < fs.Length)
{
brxz.BaseStream.Position = read;
buf = brxz.ReadBytes(buf.Length);
if (lo > 419430400)
{
GetPositionAfterMatchLarge(buf, iffscan, read);
read += buf.Length;
}
else
{
GetPositionAfterMatch(buf, iffscan);
read += buf.Length;
}
}
brxz.Close();
}
}
logbox.Items.Add(main.SelectedItem.ToString() + " ready!");
}
else
{
MessageBox.Show("Please select item");
}
}
and insert this above private void main_SelectedIndexChanged
- Code: Select all
#region scanlargefiles
public void GetPositionAfterMatchLarge(byte[] data, byte[] pattern, long add) // byte[] data is buffer, pattern is iff pattern, adress is adress where to scan
{
for (int i = 0; i < data.Length - pattern.Length; i++)
{
bool match = true;
for (int k = 0; k < pattern.Length; k++)
{
if (data[i + k] != pattern[k])
{
match = false;
break;
}
}
if (match)
{
sections.Items.Add(add + i);
}
}
}
#endregion
#region scan smaller files [ team data ]
public void GetPositionAfterMatch(byte[] data, byte[] pattern) // scan for iff possitions
{
for (int i = 0; i < data.Length - pattern.Length; i++)
{
bool match = true;
for (int k = 0; k < pattern.Length; k++)
{
if (data[i + k] != pattern[k])
{
match = false;
break;
}
}
if (match)
{
sections.Items.Add(i);
}
}
}
#endregion
*********
SECTIONS/IFFS [exports iffs to moddingfolder]
Go back to design and click sections box and under properties/events doubleclick on SelectedIndexChanged
- Code: Select all
private void sections_SelectedIndexChanged(object sender, EventArgs e)
{
if (sections.SelectedIndex != -1)
{
GetChunkSize(long.Parse(sections.SelectedItem.ToString()), Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
}
else
{
MessageBox.Show("Please select item");
}
}
and code for GetChunkSize
- Code: Select all
public int GetChunkSize(long poschunk, string radnifilex)
{
int loc = 0;
BinaryReader brsize = new BinaryReader(File.Open(radnifilex, FileMode.Open, FileAccess.Read));
brsize.BaseStream.Position = poschunk + 8;
byte[] temptorev = brsize.ReadBytes(4);
int nch;
nch = ToInt32BigEndian(temptorev, 0);
label1.Text = nch.ToString();
brsize.BaseStream.Position = poschunk;
byte[] export = brsize.ReadBytes(nch);
brsize.Close();
File.WriteAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff", export);
return loc;
}
#endregion
*******
Sections/IFFS [ scan for pks and zlibs ]
in design select sectionbox and in properties/events double click on doubleclick events
- Code: Select all
private void sections_DoubleClick(object sender, EventArgs e)
{
pkzips.Items.Clear();
zlibbox.Items.Clear();
GetChunkSize(long.Parse(sections.SelectedItem.ToString()), Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
byte[] ifftemp = File.ReadAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
finalpkzipposs = ifftemp.Length;
GetPositionAfterMatchCustom(ifftemp);
GetPositionAfterMatchCustomZlib(ifftemp);
pkzips.DataSource = pkchunkslist;
logbox.Items.Add("Scanned " + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
}
*******
UNPACK ALL IFFS from main file to moddingfolder
in designer add a button and doubleclick on it
- Code: Select all
private void sections_DoubleClick(object sender, EventArgs e)
{
pkzips.Items.Clear();
zlibbox.Items.Clear();
GetChunkSize(long.Parse(sections.SelectedItem.ToString()), Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
byte[] ifftemp = File.ReadAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
finalpkzipposs = ifftemp.Length;
GetPositionAfterMatchCustom(ifftemp);
GetPositionAfterMatchCustomZlib(ifftemp);
pkzips.DataSource = pkchunkslist;
logbox.Items.Add("Scanned " + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
}
and code for fullPK export
- Code: Select all
public void fullPKexport(int index)
{
int total = sections.Items.Count;
index = 0;
int pkchunkindex = 0;
long indexiff = 0;
int nomember = 0;
long startpkoffset = 0;
long endpkfileoffset = 0;
byte[] ifftemp = File.ReadAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff"); //read iff
finalpkzipposs = ifftemp.Length;
GetPositionAfterMatchCustom(ifftemp);
if (pkchunkslist.Count > 0)
{
if (Directory.Exists("testx1") == true)
{
Directory.Delete("testx1", true);
}
}
byte[] data = { };
nomember = pkchunkslist.Count;
while (pkchunkindex < nomember)
{
startpkoffset = long.Parse(pkchunkslist[pkchunkindex].ToString());
using (System.IO.Stream fss = File.OpenRead(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff"))
{
BinaryReader briff = new BinaryReader(fss);
long internindexx = indexiff;
if (pkchunkindex == nomember - 1)
{
endpkfileoffset = long.Parse(finalpkzipposs.ToString());
}
else
{
string s = pkchunkslist[pkchunkindex + 1].ToString();
endpkfileoffset = long.Parse(s);
}
briff.BaseStream.Position = startpkoffset;
data = briff.ReadBytes(Convert.ToInt32(endpkfileoffset - startpkoffset));
long datasizetext = data.Length;
File.WriteAllBytes("test.dat", data);
ExtractFile("test.dat", "testx1");
if (Directory.Exists("testx1") == true)
{
string[] filestomove = Directory.GetFiles("testx1");
foreach (string s in filestomove)
{
string s2 = s.Replace("testx1\\", "");
if (Directory.Exists(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString()) == false)
{
Directory.CreateDirectory(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString());
}
if (File.Exists(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2) == true)
{
File.Delete(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2);
}
File.Move(s, outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2);
File.WriteAllText(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\info.txt", "Data size when zipped = " + datasizetext.ToString() + "bytes");
}
pkchunkindex++;
Directory.Delete("testx1", true);
}
else
{
pkchunkslist.RemoveAt(pkchunkindex + 1);
nomember = nomember - 1;
}
briff.Close();
}
}
}
FULLCODE [in case i skipped something and i did..]
- Code: Select all
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Tutorials
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string[] nba2knames = File.ReadAllLines("2knames.txt"); //read file names
public static string moddingfolder = Directory.GetCurrentDirectory() + "\\ModdingFolder\\"; //modding folder for file export-import
string outputfolder = moddingfolder + "export\\"; //export folder in modding folder
byte[] iffscan = { 0x94, 0xEF, 0x3B, 0xFF }; //94EF3BFF is IFF header
byte[] pkzippattern = { 0x50, 0x4B, 0x03, 0x04 }; //504B0304 is PK Zip Header
byte[] zlibpattern05 = { 0x00, 0x05, 0x78, 0xDA };
byte[] zlibpattern = { 0x00, 0x06, 0x78, 0xDA };
List<long> pkchunkslist = new List<long>(new long[] { }); // list to store pkoffsets
long finalpkzipposs = 0;
#region scanlargefiles
public void GetPositionAfterMatchLarge(byte[] data, byte[] pattern, long add) // byte[] data is buffer, pattern is iff pattern, adress is adress where to scan
{
for (int i = 0; i < data.Length - pattern.Length; i++)
{
bool match = true;
for (int k = 0; k < pattern.Length; k++)
{
if (data[i + k] != pattern[k])
{
match = false;
break;
}
}
if (match)
{
sections.Items.Add(add + i);
}
}
}
#endregion
#region scan smaller files [ team data ]
public void GetPositionAfterMatch(byte[] data, byte[] pattern) // scan for iff possitions
{
for (int i = 0; i < data.Length - pattern.Length; i++)
{
bool match = true;
for (int k = 0; k < pattern.Length; k++)
{
if (data[i + k] != pattern[k])
{
match = false;
break;
}
}
if (match)
{
sections.Items.Add(i);
}
}
}
#endregion
#region findpkheaderoffsets
public void GetPositionAfterMatchCustom(byte[] data)
{
for (int i = 0; i < data.Length - pkzippattern.Length; i++)
{
bool match = true;
for (int k = 0; k < pkzippattern.Length; k++)
{
if (data[i + k] != pkzippattern[k])
{
match = false;
break;
}
}
if (match)
{
pkchunkslist.Add(i);
}
}
}
#endregion
#region exportpkfromiff
public void fullPKexport(int index)
{
int total = sections.Items.Count;
index = 0;
int pkchunkindex = 0;
long indexiff = 0;
int nomember = 0;
long startpkoffset = 0;
long endpkfileoffset = 0;
byte[] ifftemp = File.ReadAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff"); //read iff
finalpkzipposs = ifftemp.Length;
GetPositionAfterMatchCustom(ifftemp);
if (pkchunkslist.Count > 0)
{
if (Directory.Exists("testx1") == true)
{
Directory.Delete("testx1", true);
}
}
byte[] data = { };
nomember = pkchunkslist.Count;
while (pkchunkindex < nomember)
{
startpkoffset = long.Parse(pkchunkslist[pkchunkindex].ToString());
using (System.IO.Stream fss = File.OpenRead(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff"))
{
BinaryReader briff = new BinaryReader(fss);
long internindexx = indexiff;
if (pkchunkindex == nomember - 1)
{
endpkfileoffset = long.Parse(finalpkzipposs.ToString());
}
else
{
string s = pkchunkslist[pkchunkindex + 1].ToString();
endpkfileoffset = long.Parse(s);
}
briff.BaseStream.Position = startpkoffset;
data = briff.ReadBytes(Convert.ToInt32(endpkfileoffset - startpkoffset));
long datasizetext = data.Length;
File.WriteAllBytes("test.dat", data);
ExtractFile("test.dat", "testx1");
if (Directory.Exists("testx1") == true)
{
string[] filestomove = Directory.GetFiles("testx1");
foreach (string s in filestomove)
{
string s2 = s.Replace("testx1\\", "");
if (Directory.Exists(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString()) == false)
{
Directory.CreateDirectory(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString());
}
if (File.Exists(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2) == true)
{
File.Delete(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2);
}
File.Move(s, outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\" + s2);
File.WriteAllText(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + "\\" + startpkoffset.ToString() + "\\info.txt", "Data size when zipped = " + datasizetext.ToString() + "bytes");
}
pkchunkindex++;
Directory.Delete("testx1", true);
}
else
{
pkchunkslist.RemoveAt(pkchunkindex + 1);
nomember = nomember - 1;
}
briff.Close();
}
}
}
#endregion
#region extractpkfile
public void ExtractFile(string source, string destination)
{
if (Ionic.Zip.ZipFile.IsZipFile(source) == true)
{
string zPath = "7zG.exe";
try
{
ProcessStartInfo pro = new ProcessStartInfo();
pro.WindowStyle = ProcessWindowStyle.Hidden;
pro.FileName = zPath;
pro.Arguments = "x -y \"" + source + "\" -o" + "\"" + destination + "\"";
Process x = Process.Start(pro);
x.WaitForExit();
x.Close();
}
catch (System.Exception Ex)
{
}
}
else
{
}
}
#endregion
public static int ToInt32BigEndian(byte[] buf, int i)
{
return (buf[i] << 24) | (buf[i + 1] << 16) | (buf[i + 2] << 8) | buf[i + 3];
}
#region exportifffrommain
public void exportiff()
{
using (System.IO.Stream input = System.IO.File.OpenRead(Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString()))
{
BinaryReader bx = new BinaryReader(input);
byte[] exp = { };
string size = input.Length.ToString();
bx.BaseStream.Position = long.Parse(sections.SelectedItem.ToString());
byte[] exportIFFx = bx.ReadBytes(Int32.Parse(size));
File.WriteAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff", exportIFFx);
bx.Close();
logbox.Items.Add("Saved " + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
}
}
#endregion
#region getsizeofiffs
public int GetChunkSize(long poschunk, string radnifilex)
{
int loc = 0;
BinaryReader brsize = new BinaryReader(File.Open(radnifilex, FileMode.Open, FileAccess.Read));
brsize.BaseStream.Position = poschunk + 8;
byte[] temptorev = brsize.ReadBytes(4);
int nch;
nch = ToInt32BigEndian(temptorev, 0);
label1.Text = nch.ToString();
brsize.BaseStream.Position = poschunk;
byte[] export = brsize.ReadBytes(nch);
brsize.Close();
File.WriteAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff", export);
return loc;
}
#endregion
#region findzliboffsets
public void GetPositionAfterMatchCustomZlib(byte[] data)
{
for (int i = 0; i < data.Length - zlibpattern.Length; i++)
{
bool match = true;
bool match2 = true;
for (int k = 0; k < zlibpattern.Length; k++)
{
if (data[i + k] != zlibpattern[k])
{
match = false;
if (data[i + k] != zlibpattern05[k])
{
match2 = false;
break;
}
}
}
if (match == true || match2 == true)
{
zlibbox.Items.Add(i + 2);
}
}
}
#endregion
private void Form1_Load(object sender, EventArgs e)
{
foreach (string s in nba2knames)
{
if (File.Exists(Directory.GetCurrentDirectory() + "\\" + s))
{
main.Items.Add(s);
}
else
{
}
}
}
private void main_SelectedIndexChanged(object sender, EventArgs e)
{
if (main.SelectedIndex != -1)
{
sections.Items.Clear();
string fldr = outputfolder + main.SelectedItem.ToString();
if (Directory.Exists(fldr) == false)
{
Directory.CreateDirectory(outputfolder + main.SelectedItem.ToString());
}
Int64 read = 0;
FileInfo fi = new FileInfo(Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
long lo = fi.Length;
using (FileStream fs = new FileStream(Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString(), FileMode.Open, FileAccess.Read))
{
byte[] buf = new byte[1024 * 1024 * 400];
if (main.SelectedIndex != -1)
{
BinaryReader brxz = new BinaryReader(fs);
while (read < fs.Length)
{
brxz.BaseStream.Position = read;
buf = brxz.ReadBytes(buf.Length);
if (lo > 419430400)
{
GetPositionAfterMatchLarge(buf, iffscan, read);
read += buf.Length;
}
else
{
GetPositionAfterMatch(buf, iffscan);
read += buf.Length;
}
}
brxz.Close();
}
}
logbox.Items.Add(main.SelectedItem.ToString() + " ready!");
}
else
{
MessageBox.Show("Please select item");
}
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
private void sections_SelectedIndexChanged(object sender, EventArgs e)
{
if (sections.SelectedIndex != -1)
{
GetChunkSize(long.Parse(sections.SelectedItem.ToString()), Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
}
else
{
MessageBox.Show("Please select item");
}
}
#region scanoffsetstolistbox
private void sections_DoubleClick(object sender, EventArgs e)
{
pkzips.Items.Clear();
zlibbox.Items.Clear();
GetChunkSize(long.Parse(sections.SelectedItem.ToString()), Directory.GetCurrentDirectory() + "\\" + main.SelectedItem.ToString());
byte[] ifftemp = File.ReadAllBytes(outputfolder + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
finalpkzipposs = ifftemp.Length;
GetPositionAfterMatchCustom(ifftemp);
GetPositionAfterMatchCustomZlib(ifftemp);
pkzips.DataSource = pkchunkslist;
logbox.Items.Add("Scanned " + main.SelectedItem.ToString() + "\\" + sections.SelectedItem.ToString() + ".iff");
}
#endregion
#region extractallpkzipsfromiffs
private void button2_Click(object sender, EventArgs e)
{
int sectionindex = 0;
while (sectionindex < sections.Items.Count)
{
sections.SelectedIndex = sectionindex;
fullPKexport(sectionindex);
sectionindex = sectionindex + 1;
pkchunkslist.Clear(); //clear pkzip list of offsets
zlibbox.Items.Clear(); //clear zlibbs
}
MessageBox.Show("DONE!");
}
#endregion
}
}
Hope others will continue work since i wont be able in next 7-10 days for sure...
Cheers