diff --git a/fstester/README.md b/fstester/README.md
new file mode 100644
index 00000000..285cb459
--- /dev/null
+++ b/fstester/README.md
@@ -0,0 +1,8 @@
+DiscImageChef Filesystem Testers
+================================
+
+This folder contains source code for snippets designed to retrieve special features
+(e.g. extended attributes) from all files on installed volumes (getters) as well as snippets
+designed to create known files with all features specific to an
+operating system / filesystem combination to reverse engineer them and/or test
+DiscImageChef filesystem implementations.
\ No newline at end of file
diff --git a/fstester/getter/README.md b/fstester/getter/README.md
new file mode 100644
index 00000000..ab08d6bd
--- /dev/null
+++ b/fstester/getter/README.md
@@ -0,0 +1,8 @@
+DiscImageChef Filesystem Testers: Getters
+=========================================
+
+This folder contains snippets designed to retrieve special features from files on a volume
+that can be feed to the Setters snippets to create special test filesystem volumes.
+
+`os2_32` contains a snippet designed to retrieve all Extended Attributes from an OS/2 volume,
+under a 32-bit OS/2 version.
\ No newline at end of file
diff --git a/fstester/getter/os2_32/DIR.C b/fstester/getter/os2_32/DIR.C
new file mode 100644
index 00000000..a68cbe6f
--- /dev/null
+++ b/fstester/getter/os2_32/DIR.C
@@ -0,0 +1,228 @@
+/****************************************************************************
+The Disc Image Chef
+-----------------------------------------------------------------------------
+
+Filename : dir.c
+Author(s) : Natalia Portillo
+
+Component : fstester.getter.os2
+
+--[ Description ] -----------------------------------------------------------
+
+Contains directory handlers
+
+--[ License ] ---------------------------------------------------------------
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warraty of
+ MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+-----------------------------------------------------------------------------
+Copyright (C) 2011-2018 Natalia Portillo
+*****************************************************************************/
+
+#define INCL_DOSFILEMGR // File Manager values
+#define INCL_DOSERRORS // DOS error values
+
+#include
+#include
+#include
+#include
+#include "dir.h"
+#include "ea.h"
+
+int GetAllInDir(PSZ path, ULONG *eaCounter)
+{
+ HDIR hdirFindHandle;
+ FILEFINDBUF3 FindBuffer = {0}; // Returned from FindFirst/Next
+ ULONG ulResultBufLen;
+ ULONG ulFindCount;
+ APIRET rc; // Return code
+ PSZ pathWithWildcard;
+ PSZ fullPath;
+ ULONG flAttribute; // File attributes
+ int isDir = 0;
+ APIRET drc;
+
+ // Variables for EA saving
+ char *eaBuffer;
+ size_t eaSize;
+ char eaPath[8 + 1 + 3 + 1];
+ HFILE eaFileHandle; // Address of the handle for the file
+ ULONG ulAction = 0; // Address of the variable that receives the value that specifies the action taken by the DosOpen function
+ APIRET earc;
+
+ for(isDir = 0; isDir < 2; isDir++)
+ {
+ hdirFindHandle = HDIR_CREATE;
+ ulResultBufLen = sizeof(FILEFINDBUF3);
+ ulFindCount = 1; // Look for 1 file at a time
+ rc = NO_ERROR; // Return code
+ pathWithWildcard = malloc(strlen(path) + 5);
+ strcpy(pathWithWildcard, path);
+ strcat(pathWithWildcard, "\\*.*"); // Adds wildcard to passed path
+
+ flAttribute = FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN | FILE_READONLY; // All files
+ if(isDir)
+ flAttribute |= MUST_HAVE_DIRECTORY; // Must be a directory
+
+ rc = DosFindFirst(pathWithWildcard, // File pattern
+ &hdirFindHandle, // Directory search handle
+ flAttribute, // Search attribute
+ &FindBuffer, // Result buffer
+ ulResultBufLen, // Result buffer length
+ &ulFindCount, // Number of entries to find
+ FIL_STANDARD); // Return Level 1 file info
+
+ if(rc != NO_ERROR)
+ {
+ free(pathWithWildcard);
+ if(rc == ERROR_NO_MORE_FILES && !isDir)
+ continue;
+
+ printf("DosFindFirst error: return code = %u\n", rc);
+ return rc;
+ }
+ else
+ {
+ if(strcmp(FindBuffer.achName, ".") != 0 && strcmp(FindBuffer.achName, "..") != 0)
+ {
+ fullPath = malloc(strlen(path) + 2 + strlen(FindBuffer.achName) + 1);
+ fullPath = strcpy(fullPath, path); // Parent path
+ strcat(fullPath, "\\"); // Adds slashes
+ strcat(fullPath, FindBuffer.achName); // Adds filename
+ if(isDir)
+ printf("%s\\\n", fullPath); // Print directory name
+ else
+ printf("%s\n", fullPath); // Print file name
+ if(strcmp(FindBuffer.achName, ".") != 0 && strcmp(FindBuffer.achName, "..") != 0)
+ {
+ eaSize = 0;
+ GetEAs(fullPath, &eaBuffer, &eaSize);
+
+ if(eaSize != 0)
+ {
+ sprintf(&eaPath, "%08d.EA", *eaCounter);
+ earc = DosOpen(eaPath, &eaFileHandle, &ulAction, 0L, FILE_NORMAL,
+ OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS,
+ OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE, NULL);
+
+ if(earc == NO_ERROR)
+ {
+ earc = DosWrite(eaFileHandle, eaBuffer, eaSize, &ulAction);
+ if(earc == NO_ERROR)
+ {
+ printf("\tSaved %ld bytes from %ld bytes of EAs saved to %08d.EA\n", ulAction, eaSize,
+ *eaCounter);
+ *eaCounter += 1;
+ }
+ DosClose(eaFileHandle);
+ }
+
+ free(eaBuffer);
+ }
+
+ if(isDir)
+ {
+ drc = GetAllInDir(fullPath, eaCounter);
+ if(drc != NO_ERROR && drc != ERROR_NO_MORE_FILES)
+ {
+ printf("GetAllInDir(%s) returned %u\n", fullPath, drc);
+ return drc;
+ }
+ }
+ }
+
+ free(fullPath);
+ }
+ }
+
+ while(rc != ERROR_NO_MORE_FILES)
+ {
+ ulFindCount = 1; // Reset find count
+
+ rc = DosFindNext(hdirFindHandle, // Directory handle
+ &FindBuffer, // Result buffer
+ ulResultBufLen, // Result buffer length
+ &ulFindCount); // Number of entries to find
+
+ if(rc != NO_ERROR && rc != ERROR_NO_MORE_FILES)
+ {
+ free(pathWithWildcard);
+ printf("DosFindNext error: return code = %u\n", rc);
+ return rc;
+ }
+ else
+ {
+ if(strcmp(FindBuffer.achName, ".") == 0 || strcmp(FindBuffer.achName, "..") == 0)
+ continue;
+
+ fullPath = malloc(strlen(path) + 2 + strlen(FindBuffer.achName) + 1);
+ fullPath = strcpy(fullPath, path); // Parent path
+ strcat(fullPath, "\\"); // Adds slashes
+ strcat(fullPath, FindBuffer.achName); // Adds filename
+ if(isDir)
+ printf("%s\\\n", fullPath); // Print directory name
+ else
+ printf("%s\n", fullPath); // Print file name
+
+ eaSize = 0;
+ GetEAs(fullPath, &eaBuffer, &eaSize);
+
+ if(eaSize != 0)
+ {
+ sprintf(&eaPath, "%08d.EA", *eaCounter);
+ earc = DosOpen(eaPath, &eaFileHandle, &ulAction, 0L, FILE_NORMAL,
+ OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS,
+ OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE, NULL);
+
+ if(earc == NO_ERROR)
+ {
+ earc = DosWrite(eaFileHandle, eaBuffer, eaSize, &ulAction);
+ if(earc == NO_ERROR)
+ {
+ printf("\tSaved %ld bytes from %ld bytes of EAs saved to %08d.EA\n", ulAction, eaSize,
+ *eaCounter);
+ *eaCounter += 1;
+ }
+ DosClose(eaFileHandle);
+ }
+ else
+ printf("Error %d calling DosOpen\n", earc);
+
+ free(eaBuffer);
+ }
+
+ if(isDir)
+ {
+ drc = GetAllInDir(fullPath, eaCounter);
+ if(drc != NO_ERROR && drc != ERROR_NO_MORE_FILES)
+ {
+ printf("GetAllInDir(%s) returned %u\n", fullPath, drc);
+ return drc;
+ }
+ }
+
+ free(fullPath);
+ } /* endif */
+ } /* endwhile */
+
+ free(pathWithWildcard);
+ rc = DosFindClose(hdirFindHandle); // Close our directory handle
+ if(rc != NO_ERROR)
+ {
+ printf("DosFindClose error: return code = %u\n", rc);
+ return rc;
+ }
+ }
+ return ERROR_NO_MORE_FILES;
+}
+
diff --git a/fstester/getter/os2_32/DIR.H b/fstester/getter/os2_32/DIR.H
new file mode 100644
index 00000000..7963713a
--- /dev/null
+++ b/fstester/getter/os2_32/DIR.H
@@ -0,0 +1,37 @@
+/****************************************************************************
+The Disc Image Chef
+-----------------------------------------------------------------------------
+
+Filename : dir.h
+Author(s) : Natalia Portillo
+
+Component : fstester.getter.os2
+
+--[ Description ] -----------------------------------------------------------
+
+Contains directory definitions
+
+--[ License ] ---------------------------------------------------------------
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warraty of
+ MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+-----------------------------------------------------------------------------
+Copyright (C) 2011-2018 Natalia Portillo
+*****************************************************************************/
+
+#ifndef DIC_FSTESTER_GETTER_OS2_DIR_H
+#define DIC_FSTESTER_GETTER_OS2_DIR_H
+
+int GetAllInDir();
+
+#endif
diff --git a/fstester/getter/os2_32/EA.C b/fstester/getter/os2_32/EA.C
new file mode 100644
index 00000000..219ef952
--- /dev/null
+++ b/fstester/getter/os2_32/EA.C
@@ -0,0 +1,93 @@
+/* Public domain code from Info/Zip
+ * Written by Kai Uew Rommel
+ * from zip30/os2/os2zip.c
+ * Modified by Natalia Portillo
+ */
+
+#include
+#include
+
+#define INCL_NOPM
+#define INCL_DOSNLS
+#define INCL_DOSERRORS
+
+#include
+
+#include "ea.h"
+
+void GetEAs(char *path, char **bufptr, size_t *size)
+{
+ FILESTATUS4 fs;
+ PDENA2 pDENA, pFound;
+ EAOP2 eaop;
+ PGEA2 pGEA;
+ PGEA2LIST pGEAlist;
+ PFEA2LIST pFEAlist;
+ ULONG ulAttributes;
+ ULONG nLength;
+ ULONG nBlock;
+
+ if(DosQueryPathInfo(path, FIL_QUERYEASIZE, (PBYTE) & fs, sizeof(fs)))
+ return;
+
+ nBlock = max(fs.cbList, 65535);
+
+ if((pDENA = malloc((size_t)nBlock)) == NULL)
+ return;
+
+ ulAttributes = -1;
+
+ if(DosEnumAttribute(ENUMEA_REFTYPE_PATH, path, 1, pDENA, nBlock, &ulAttributes, ENUMEA_LEVEL_NO_VALUE) ||
+ ulAttributes == 0 || (pGEAlist = malloc((size_t)nBlock)) == NULL)
+ {
+ free(pDENA);
+ return;
+ }
+
+ pGEA = pGEAlist->list;
+ memset(pGEAlist, 0, nBlock);
+ pFound = pDENA;
+
+ while(ulAttributes--)
+ {
+ pGEA->cbName = pFound->cbName;
+ strcpy(pGEA->szName, pFound->szName);
+
+ nLength = sizeof(GEA2) + strlen(pGEA->szName);
+ nLength = ((nLength - 1) / sizeof(ULONG) + 1) * sizeof(ULONG);
+
+ pGEA->oNextEntryOffset = ulAttributes ? nLength : 0;
+ pGEA = (PGEA2)((PCH)pGEA + nLength);
+
+ pFound = (PDENA2)((PCH)pFound + pFound->oNextEntryOffset);
+ }
+
+ if(pGEA == pGEAlist->list) // No attributes to save
+ {
+ free(pDENA);
+ free(pGEAlist);
+ return;
+ }
+
+ pGEAlist->cbList = (PCH)pGEA - (PCH)pGEAlist;
+
+ pFEAlist = (PVOID)pDENA; // reuse buffer
+ pFEAlist->cbList = nBlock;
+
+ eaop.fpGEA2List = pGEAlist;
+ eaop.fpFEA2List = pFEAlist;
+ eaop.oError = 0;
+
+ if(DosQueryPathInfo(path, FIL_QUERYEASFROMLIST, (PBYTE) & eaop, sizeof(eaop)))
+ {
+ free(pDENA);
+ free(pGEAlist);
+ return;
+ }
+
+ *size = pFEAlist->cbList;
+ *bufptr = (char *)pFEAlist;
+
+ free(pDENA);
+ free(pGEAlist);
+}
diff --git a/fstester/getter/os2_32/EA.H b/fstester/getter/os2_32/EA.H
new file mode 100644
index 00000000..c45bd667
--- /dev/null
+++ b/fstester/getter/os2_32/EA.H
@@ -0,0 +1,41 @@
+/****************************************************************************
+The Disc Image Chef
+-----------------------------------------------------------------------------
+
+Filename : ea.h
+Author(s) : Natalia Portillo
+
+Component : fstester.getter.os2
+
+--[ Description ] -----------------------------------------------------------
+
+Contains extended attribute definitions
+
+--[ License ] ---------------------------------------------------------------
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warraty of
+ MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+-----------------------------------------------------------------------------
+Copyright (C) 2011-2018 Natalia Portillo
+*****************************************************************************/
+
+#ifndef DIC_FSTESTER_GETTER_OS2_EA_H
+#define DIC_FSTESTER_GETTER_OS2_EA_H
+
+#ifndef max
+#define max(a, b) ((a) < (b) ? (b) : (a))
+#endif
+
+void GetEAs();
+
+#endif
diff --git a/fstester/getter/os2_32/MAIN.C b/fstester/getter/os2_32/MAIN.C
new file mode 100644
index 00000000..f7c2b7a5
--- /dev/null
+++ b/fstester/getter/os2_32/MAIN.C
@@ -0,0 +1,46 @@
+/****************************************************************************
+The Disc Image Chef
+-----------------------------------------------------------------------------
+
+Filename : main.c
+Author(s) : Natalia Portillo
+
+Component : fstester.getter.os2
+
+--[ Description ] -----------------------------------------------------------
+
+Contains global definitions
+
+--[ License ] ---------------------------------------------------------------
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warraty of
+ MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+-----------------------------------------------------------------------------
+Copyright (C) 2011-2018 Natalia Portillo
+*****************************************************************************/
+
+#include
+
+#include
+
+#include "main.h"
+#include "dir.h"
+
+int main()
+{
+ ULONG eaCounter = 0;
+ printf("The Disc Image Chef Filesystem Tester (Getter) for OS/2 %s\n", DIC_FSTESTER_VERSION);
+ printf("%s\n", DIC_COPYRIGHT);
+
+ return GetAllInDir("C:", &eaCounter);
+}
diff --git a/fstester/getter/os2_32/MAIN.H b/fstester/getter/os2_32/MAIN.H
new file mode 100644
index 00000000..97ae69e6
--- /dev/null
+++ b/fstester/getter/os2_32/MAIN.H
@@ -0,0 +1,38 @@
+/****************************************************************************
+The Disc Image Chef
+-----------------------------------------------------------------------------
+
+Filename : main.h
+Author(s) : Natalia Portillo
+
+Component : fstester.getter.os2
+
+--[ Description ] -----------------------------------------------------------
+
+Contains global definitions
+
+--[ License ] ---------------------------------------------------------------
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warraty of
+ MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+-----------------------------------------------------------------------------
+Copyright (C) 2011-2018 Natalia Portillo
+*****************************************************************************/
+
+#ifndef DIC_FSTESTER_GETTER_OS2_MAIN_H
+#define DIC_FSTESTER_GETTER_OS2_MAIN_H
+
+#define DIC_FSTESTER_VERSION "0.1"
+#define DIC_COPYRIGHT "Copyright (C) 2011-2018 Natalia Portillo"
+
+#endif
diff --git a/fstester/getter/os2_32/OS2.EXE b/fstester/getter/os2_32/OS2.EXE
new file mode 100755
index 00000000..0a4537a2
Binary files /dev/null and b/fstester/getter/os2_32/OS2.EXE differ
diff --git a/fstester/getter/os2_32/OS2.LK1 b/fstester/getter/os2_32/OS2.LK1
new file mode 100644
index 00000000..4b8a3d7a
--- /dev/null
+++ b/fstester/getter/os2_32/OS2.LK1
@@ -0,0 +1,2 @@
+FIL dir.obj,ea.obj,main.obj
+
diff --git a/fstester/getter/os2_32/OS2.MAP b/fstester/getter/os2_32/OS2.MAP
new file mode 100644
index 00000000..8f0fb894
--- /dev/null
+++ b/fstester/getter/os2_32/OS2.MAP
@@ -0,0 +1,326 @@
+Open Watcom Linker Version 1.8
+Portions Copyright (c) 1985-2002 Sybase, Inc. All Rights Reserved.
+Created on: 18/01/10 16:16:05
+Executable Image: os2.exe
+creating an OS/2 32-bit executable
+
+
+ +------------+
+ | Groups |
+ +------------+
+
+Group Address Size
+===== ======= ====
+
+DGROUP 0002:00000000 00010820
+
+
+
+ +--------------+
+ | Segments |
+ +--------------+
+
+Segment Class Group Address Size
+======= ===== ===== ======= ====
+
+BEGTEXT CODE AUTO 0001:00000000 00000007
+_TEXT CODE AUTO 0001:00000010 0000347f
+_NULL BEGDATA DGROUP 0002:00000000 00000004
+_AFTERNULL BEGDATA DGROUP 0002:00000004 00000000
+CONST DATA DGROUP 0002:00000004 00000198
+CONST2 DATA DGROUP 0002:0000019c 00000000
+_DATA DATA DGROUP 0002:0000019c 00000434
+XIB DATA DGROUP 0002:000005d0 00000000
+XI DATA DGROUP 0002:000005d0 00000012
+XIE DATA DGROUP 0002:000005e2 00000000
+YIB DATA DGROUP 0002:000005e2 00000000
+YI DATA DGROUP 0002:000005e2 00000006
+YIE DATA DGROUP 0002:000005e8 00000000
+TIB DATA DGROUP 0002:000005e8 00000000
+TI DATA DGROUP 0002:000005e8 00000000
+TIE DATA DGROUP 0002:000005e8 00000000
+DATA DATA DGROUP 0002:000005e8 00000000
+_BSS BSS DGROUP 0002:000005e8 0000022c
+STACK STACK DGROUP 0002:00000820 00010000
+
+
+ +----------------+
+ | Memory Map |
+ +----------------+
+
+* = unreferenced symbol
++ = symbol only referenced locally
+
+Address Symbol
+======= ======
+
+Module: dir.obj(C:\dic\os2\dir.c)
+0001:00000130 GetAllInDir
+Module: ea.obj(C:\dic\os2\ea.c)
+0001:00000710 GetEAs
+Module: main.obj(C:\dic\os2\main.c)
+0001:0000092d main
+Module: C:\WATCOM/lib386/os2\clib3s.lib(stk)
+0001:000009a1* __STK
+0001:00000991 __CHK
+0001:000009cd* __GRO
+0001:000009c0* __STKOVERFLOW
+Module: C:\WATCOM/lib386/os2\clib3s.lib(strlen.c)
+0001:000009f0 strlen
+Module: C:\WATCOM/lib386/os2\clib3s.lib(nmalloc.c)
+0001:00000a10 malloc
+0001:00000a20 _nmalloc
+0002:000001ac __nheapbeg
+0002:000001b0 __MiniHeapRover
+0002:000001b4 __LargestSizeB4MiniHeapRover
+Module: C:\WATCOM/lib386/os2\clib3s.lib(strcpy.c)
+0001:00000b40 strcpy
+Module: C:\WATCOM/lib386/os2\clib3s.lib(strcat.c)
+0001:00000b70 strcat
+Module: C:\WATCOM/lib386/os2\clib3s.lib(nfree.c)
+0001:00000bb0 free
+0001:00000bc0 _nfree
+0002:000005e8 __MiniHeapFreeRover
+Module: C:\WATCOM/lib386/os2\clib3s.lib(printf.c)
+0001:00000cd0 printf
+Module: C:\WATCOM/lib386/os2\clib3s.lib(_strcmp)
+0001:00000d00 strcmp
+Module: C:\WATCOM/lib386/os2\clib3s.lib(sprintf.c)
+0001:00000e50 sprintf
+Module: C:\WATCOM/lib386/os2\clib3s.lib(memset.c)
+0001:00000e80 memset
+Module: C:\WATCOM/lib386/os2\clib3s.lib(cstart)
+0001:00000ea0 _cstart_
+Module: C:\WATCOM/lib386/os2\clib3s.lib(xmsgo32.c)
+0001:00000f00+ __exit_with_msg
+0001:00000f50 __fatal_runtime_error
+Module: C:\WATCOM/lib386/os2\clib3s.lib(maino32.c)
+0002:000001b8+ __FirstThreadData
+0002:000001bc __GetThreadPtr
+0002:000001c0 _AccessFileH
+0002:000001c4 _ReleaseFileH
+0002:000001c8 _AccessIOB
+0002:000001cc _ReleaseIOB
+0002:000001d0 _AccessNHeap
+0002:000001d4* _AccessFHeap
+0002:000001d8 _ReleaseNHeap
+0002:000001dc* _ReleaseFHeap
+0002:000001e0* _AccessTDList
+0001:00000f8b __threadstack
+0001:00000f92* __threadid
+0001:00000f9b __OS2MainInit
+0001:0000100c+ __OS2Init
+0001:0000104d* __OS2Fini
+0001:00001055+ __shutdown_stack_checking
+0001:0000106a __exit
+0002:000001e4* _ReleaseTDList
+0002:000001e8+ __sig_init_rtn
+0002:000001ec* __sig_fini_rtn
+0002:000001f0* __threadstksize
+0002:000001f4 __process_fini
+0002:000005ec __Is_DLL
+0002:000005f0+ __saved_CS
+Module: C:\WATCOM/lib386/os2\clib3s.lib(nmemneed.c)
+0001:000010c0 __nmemneed
+Module: C:\WATCOM/lib386/os2\clib3s.lib(mem.c)
+0001:000010d0 __MemAllocator
+0001:00001180 __MemFree
+Module: C:\WATCOM/lib386/os2\clib3s.lib(grownear.c)
+0001:00001430 __ExpandDGROUP
+Module: C:\WATCOM/lib386/os2\clib3s.lib(iob.c)
+0002:000001f8 __iob
+0002:00000400* _fmode
+0002:000006f4 __OpenStreams
+0002:000006f8 __ClosedStreams
+Module: C:\WATCOM/lib386/os2\clib3s.lib(fprtf.c)
+0001:00001470 __fprtf
+Module: C:\WATCOM/lib386/os2\clib3s.lib(vsprintf.c)
+0001:00001570 vsprintf
+Module: C:\WATCOM/lib386/os2\clib3s.lib(__stos)
+0001:000015a0 __STOSB
+0001:000015d7* __STOSD
+Module: C:\WATCOM/lib386/os2\clib3s.lib(main2o32.c)
+0001:00001650 __OS2Main
+Module: C:\WATCOM/lib386/os2\clib3s.lib(segdefns)
+0001:00000003 ___begtext
+0002:00000000* __nullarea
+0002:000005d0 _Start_XI
+0002:000005e2 _End_XI
+0002:000005e2 _Start_YI
+0002:000005e8 _End_YI
+Module: C:\WATCOM/lib386/os2\clib3s.lib(enterdb.c)
+0001:000016c0 __EnterWVIDEO
+0002:00000404+ __WD_Present
+Module: C:\WATCOM/lib386/os2\clib3s.lib(crwdata)
+0002:0000044c _osmajor
+0002:0000044d _osminor
+0002:00000418* _LpDllName
+0002:0000041c* _LpwCmdLine
+0002:00000420* _LpwPgmName
+0002:00000424* _LpwDllName
+0002:00000410 _LpCmdLine
+0002:00000414 _LpPgmName
+0002:00000408* _dynend
+0002:0000040c _curbrk
+0002:00000428* _STACKLOW
+0002:0000042c* _STACKTOP
+0002:00000430 __ASTACKSIZ
+0002:00000434 __ASTACKPTR
+0002:00000438* _cbyte
+0002:0000043c* _cbyte2
+0002:00000440* _child
+0002:00000446 _Envptr
+0002:0000044a* _Envseg
+0002:00000444* __no87
+0002:0000044e* __FPE_handler
+Module: C:\WATCOM/lib386/os2\clib3s.lib(cinit.c)
+0001:000016f0 __CommonInit
+0002:000006fc __hmodule
+Module: C:\WATCOM/lib386/os2\clib3s.lib(initrtns.c)
+0001:00001710 __InitRtns
+0001:00001770 __FiniRtns
+Module: C:\WATCOM/lib386/os2\clib3s.lib(amblksiz.c)
+0002:00000454 _amblksiz
+Module: C:\WATCOM/lib386/os2\clib3s.lib(heapen.c)
+0001:000017e0* _heapenable
+0002:00000458 __heap_enabled
+Module: C:\WATCOM/lib386/os2\clib3s.lib(nheapmin.c)
+0001:00001800* _heapshrink
+0001:00001810* _heapmin
+0001:00001820* _nheapmin
+0001:000018e0 _nheapshrink
+Module: C:\WATCOM/lib386/os2\clib3s.lib(initfile.c)
+0001:00001950 __InitFiles
+Module: C:\WATCOM/lib386/os2\clib3s.lib(ioexit.c)
+0001:00001a60* fcloseall
+0001:00001a70 __full_io_exit
+Module: C:\WATCOM/lib386/os2\clib3s.lib(fputc.c)
+0001:00001a80 fputc
+Module: C:\WATCOM/lib386/os2\clib3s.lib(ioalloc.c)
+0001:00001b80 __ioalloc
+Module: C:\WATCOM/lib386/os2\clib3s.lib(prtf.c)
+0001:00001c20 __prtf
+Module: C:\WATCOM/lib386/os2\clib3s.lib(flush.c)
+0001:000029d0 __flush
+Module: C:\WATCOM/lib386/os2\clib3s.lib(mthrdini.c)
+0001:00002ae0 __InitThreadData
+0002:0000045c __ThreadDataSize
+Module: C:\WATCOM/lib386/os2\clib3s.lib(cmain386.c)
+0001:00002b00 __CMain
+Module: C:\WATCOM/lib386/os2\clib3s.lib(dosseg)
+0000:00001234 __DOSseg__
+Module: C:\WATCOM/lib386/os2\clib3s.lib(fclose.c)
+0001:00002b50+ __doclose
+0001:00002c10 __shutdown_stream
+0001:00002c40* fclose
+0002:00000700+ __RmTmpFileFn
+Module: C:\WATCOM/lib386/os2\clib3s.lib(freefp.c)
+0001:00002c80 __freefp
+0001:00002cd0 __purgefp
+Module: C:\WATCOM/lib386/os2\clib3s.lib(seterrno.c)
+0001:00002d02 __set_errno
+0001:00002d13* __set_EDOM
+0001:00002d21* __set_ERANGE
+0001:00002d2f* __set_EINVAL
+0001:00002d42 __set_doserrno
+Module: C:\WATCOM/lib386/os2\clib3s.lib(chktty.c)
+0001:00002d60 __chktty
+Module: C:\WATCOM/lib386/os2\clib3s.lib(wctomb.c)
+0001:00002da0 wctomb
+Module: C:\WATCOM/lib386/os2\clib3s.lib(itoa.c)
+0001:00002de0+ utoa
+0001:00002e40 itoa
+Module: C:\WATCOM/lib386/os2\clib3s.lib(strupr.c)
+0001:00002e80 strupr
+Module: C:\WATCOM/lib386/os2\clib3s.lib(noefgfmt.c)
+0002:00000460 __EFG_printf
+0002:00000464* __EFG_scanf
+Module: C:\WATCOM/lib386/os2\clib3s.lib(lltoa.c)
+0001:00002ee0 ulltoa
+0001:00002f50* lltoa
+Module: C:\WATCOM/lib386/os2\clib3s.lib(ltoa.c)
+0001:00002f90 ultoa
+0001:00002ff0* ltoa
+Module: C:\WATCOM/lib386/os2\clib3s.lib(mbisdbcs.c)
+0002:00000704 __IsDBCS
+Module: C:\WATCOM/lib386/os2\clib3s.lib(mbislead.c)
+0001:00003030* _ismbblead
+0002:00000708 __MBCSIsTable
+Module: C:\WATCOM/lib386/os2\clib3s.lib(lseekos2.c)
+0001:00003060 __lseek
+Module: C:\WATCOM/lib386/os2\clib3s.lib(fsync.c)
+0001:000030a0 fsync
+Module: C:\WATCOM/lib386/os2\clib3s.lib(qwrit.c)
+0001:000030d0 __qwrite
+Module: C:\WATCOM/lib386/os2\clib3s.lib(___argc.c)
+0002:0000080c ___Argc
+0002:00000810 ___Argv
+Module: C:\WATCOM/lib386/os2\clib3s.lib(exit.c)
+0001:00003190+ __null_int23_exit
+0001:00003192 exit
+0001:000031e2* _exit
+0002:00000468+ __int23_exit
+0002:0000046c+ __FPE_handler_exit
+Module: C:\WATCOM/lib386/os2\clib3s.lib(_clseos2.c)
+0001:00003200 __close
+Module: C:\WATCOM/lib386/os2\clib3s.lib(isattos2.c)
+0001:00003250 isatty
+Module: C:\WATCOM/lib386/os2\clib3s.lib(alphabet.c)
+0002:00000174 __Alphabet
+Module: C:\WATCOM/lib386/os2\clib3s.lib(mbinit.c)
+0001:000032c1 __mbinit
+0002:00000470+ __MBCodePage
+Module: C:\WATCOM/lib386/os2\clib3s.lib(dosret.c)
+0001:000033d0+ _dosretax
+0001:000033f0* _dosret0
+0001:00003410 __set_errno_dos
+Module: C:\WATCOM/lib386/os2\clib3s.lib(iomode.c)
+0001:00003450 __GetIOMode
+0001:00003470 __SetIOMode_nogrow
+0002:00000578+ __NFiles
+0002:0000057c+ __init_mode
+0002:000005cc+ __io_mode
+
+
+ +----------------------+
+ | Imported Symbols |
+ +----------------------+
+
+Symbol Module
+====== ======
+
+DosFindFirst DOSCALLS
+DosOpen DOSCALLS
+DosWrite DOSCALLS
+DosClose DOSCALLS
+DosFindNext DOSCALLS
+DosFindClose DOSCALLS
+DosQueryPathInfo DOSCALLS
+DosEnumAttribute DOSCALLS
+DosQuerySysInfo DOSCALLS
+DosExit DOSCALLS
+DosAllocMem DOSCALLS
+DosFreeMem DOSCALLS
+DosSetFilePtr DOSCALLS
+DosResetBuffer DOSCALLS
+DosQueryHType DOSCALLS
+DosQueryDBCSEnv NLS
+DosQueryCp DOSCALLS
+
+
+ +--------------------+
+ | Libraries Used |
+ +--------------------+
+
+C:\WATCOM/lib386/os2\clib3s.lib
+C:\WATCOM/lib386/os2\os2386.lib
+
+
+ +-----------------------+
+ | Linker Statistics |
+ +-----------------------+
+
+Stack size: 00010000 (65536.)
+Memory size: 00013caf (81071.)
+Entry point address: 0001:00000ea0
+Link time: 00:00.08
diff --git a/fstester/getter/os2_32/OS2.MK b/fstester/getter/os2_32/OS2.MK
new file mode 100644
index 00000000..19667b3d
--- /dev/null
+++ b/fstester/getter/os2_32/OS2.MK
@@ -0,0 +1,3 @@
+project : C:\dic\os2\os2.exe .SYMBOLIC
+
+!include C:\dic\os2\os2.mk1
diff --git a/fstester/getter/os2_32/OS2.MK1 b/fstester/getter/os2_32/OS2.MK1
new file mode 100644
index 00000000..673a8828
--- /dev/null
+++ b/fstester/getter/os2_32/OS2.MK1
@@ -0,0 +1,35 @@
+!define BLANK ""
+C:\dic\os2\dir.obj : C:\dic\os2\dir.c .AUTODEPEND
+ @C:
+ cd C:\dic\os2
+ *wcc386 dir.c -i="C:\WATCOM/h;C:\WATCOM/h/os2" -w4 -e25 -zq -od -d2 -3s -bt&
+=os2 -fo=.obj -mf
+
+C:\dic\os2\ea.obj : C:\dic\os2\ea.c .AUTODEPEND
+ @C:
+ cd C:\dic\os2
+ *wcc386 ea.c -i="C:\WATCOM/h;C:\WATCOM/h/os2" -w4 -e25 -zq -od -d2 -3s -bt=&
+os2 -fo=.obj -mf
+
+C:\dic\os2\main.obj : C:\dic\os2\main.c .AUTODEPEND
+ @C:
+ cd C:\dic\os2
+ *wcc386 main.c -i="C:\WATCOM/h;C:\WATCOM/h/os2" -w4 -e25 -zq -od -d2 -3s -b&
+t=os2 -fo=.obj -mf
+
+C:\dic\os2\os2.exe : C:\dic\os2\dir.obj C:\dic\os2\ea.obj C:\dic\os2\main.ob&
+j C:\dic\os2\dir.h C:\dic\os2\ea.h C:\dic\os2\main.h .AUTODEPEND
+ @C:
+ cd C:\dic\os2
+ @%write os2.lk1 FIL dir.obj,ea.obj,main.obj
+ @%append os2.lk1
+!ifneq BLANK ""
+ *wlib -q -n -b os2.imp
+ @%append os2.lk1 LIBR os2.imp
+!endif
+ *wlink name os2 d all SYS os2v2 op m op maxe=25 op q op symf op vers=0.1.0 &
+@os2.lk1
+!ifneq BLANK ""
+ rc -i $[: -i C:\WATCOM\h -i C:\WATCOM\h\os2 os2.exe
+!endif
+
diff --git a/fstester/getter/os2_32/OS2.SYM b/fstester/getter/os2_32/OS2.SYM
new file mode 100644
index 00000000..0d8dd968
Binary files /dev/null and b/fstester/getter/os2_32/OS2.SYM differ
diff --git a/fstester/getter/os2_32/OS2.TGT b/fstester/getter/os2_32/OS2.TGT
new file mode 100644
index 00000000..122e2c8f
--- /dev/null
+++ b/fstester/getter/os2_32/OS2.TGT
@@ -0,0 +1,238 @@
+40
+targetIdent
+0
+MProject
+1
+MComponent
+0
+2
+WString
+4
+OEXE
+3
+WString
+5
+oc2eo
+1
+0
+1
+4
+MCommand
+0
+5
+MCommand
+0
+6
+MItem
+7
+os2.exe
+7
+WString
+4
+OEXE
+8
+WVList
+1
+9
+MVState
+10
+WString
+7
+OS2LINK
+11
+WString
+31
+o????Version (Major.minor.rev):
+1
+12
+WString
+5
+0.1.0
+0
+13
+WVList
+1
+14
+ActionStates
+15
+WString
+5
+&Make
+16
+WVList
+0
+-1
+1
+1
+0
+17
+WPickList
+8
+18
+MItem
+3
+*.c
+19
+WString
+4
+COBJ
+20
+WVList
+2
+21
+MRState
+22
+WString
+3
+WCC
+23
+WString
+30
+??2??80386 Stack based calling
+1
+1
+24
+MRState
+25
+WString
+3
+WCC
+26
+WString
+39
+??2??Pentium Pro Register based calling
+1
+0
+27
+WVList
+0
+-1
+1
+1
+0
+28
+MItem
+5
+dir.c
+29
+WString
+4
+COBJ
+30
+WVList
+0
+31
+WVList
+0
+18
+1
+1
+0
+32
+MItem
+4
+ea.c
+33
+WString
+4
+COBJ
+34
+WVList
+0
+35
+WVList
+0
+18
+1
+1
+0
+36
+MItem
+6
+main.c
+37
+WString
+4
+COBJ
+38
+WVList
+0
+39
+WVList
+0
+18
+1
+1
+0
+40
+MItem
+3
+*.h
+41
+WString
+3
+NIL
+42
+WVList
+0
+43
+WVList
+0
+-1
+1
+1
+0
+44
+MItem
+5
+dir.h
+45
+WString
+3
+NIL
+46
+WVList
+0
+47
+WVList
+0
+40
+1
+1
+0
+48
+MItem
+4
+ea.h
+49
+WString
+3
+NIL
+50
+WVList
+0
+51
+WVList
+0
+40
+1
+1
+0
+52
+MItem
+6
+main.h
+53
+WString
+3
+NIL
+54
+WVList
+0
+55
+WVList
+0
+40
+1
+1
+0
diff --git a/fstester/getter/os2_32/OS2.WPJ b/fstester/getter/os2_32/OS2.WPJ
new file mode 100644
index 00000000..947bb2a2
--- /dev/null
+++ b/fstester/getter/os2_32/OS2.WPJ
@@ -0,0 +1,43 @@
+40
+projectIdent
+0
+VpeMain
+1
+WRect
+624
+1450
+7680
+9210
+2
+MProject
+3
+MCommand
+0
+4
+MCommand
+0
+1
+5
+WFileName
+7
+os2.tgt
+6
+WVList
+1
+7
+VComponent
+8
+WRect
+0
+0
+5712
+4330
+0
+0
+9
+WFileName
+7
+os2.tgt
+0
+2
+7
diff --git a/fstester/getter/os2_32/README.md b/fstester/getter/os2_32/README.md
new file mode 100644
index 00000000..0c1b1c12
--- /dev/null
+++ b/fstester/getter/os2_32/README.md
@@ -0,0 +1,28 @@
+DiscImageChef 32-bit OS/2 Filesystem Getter
+===========================================
+This snippet is designed to retrieve all Extended Attributes from all files in the `C:`
+volume, saving them as a set of COUNTER.EA files in executing directory.
+
+The format of those files should be as `FEA2LIST` structure (following).
+It compiles under OpenWatcom.
+
+```
+/* FEA2 defines the format for setting the full extended attributes in the file. */
+
+ typedef struct _FEA2 {
+ ULONG oNextEntryOffset; /* Offset to next entry. */
+ BYTE fEA; /* Extended attributes flag. */
+ BYTE cbName; /* Length of szName, not including NULL. */
+ USHORT cbValue; /* Value length. */
+ CHAR szName[1]; /* Extended attribute name. */
+ } FEA2;
+ typedef FEA2 *PFEA2;
+
+/* FEA2 data structure. */
+
+ typedef struct _FEA2LIST {
+ ULONG cbList; /* Total bytes of structure including full list. */
+ FEA2 list[1]; /* Variable-length FEA2 structures. */
+ } FEA2LIST;
+ typedef FEA2LIST *PFEA2LIST;
+```
\ No newline at end of file