From bb4efed8c9370f2f15ae451ba6525382c71c8bd1 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 10 Jan 2018 16:29:45 +0000 Subject: [PATCH] Add filesystem tester snippet for retrieving OS/2 EAs. --- fstester/README.md | 8 + fstester/getter/README.md | 8 + fstester/getter/os2_32/DIR.C | 228 +++++++++++++++++++++ fstester/getter/os2_32/DIR.H | 37 ++++ fstester/getter/os2_32/EA.C | 93 +++++++++ fstester/getter/os2_32/EA.H | 41 ++++ fstester/getter/os2_32/MAIN.C | 46 +++++ fstester/getter/os2_32/MAIN.H | 38 ++++ fstester/getter/os2_32/OS2.EXE | Bin 0 -> 15603 bytes fstester/getter/os2_32/OS2.LK1 | 2 + fstester/getter/os2_32/OS2.MAP | 326 +++++++++++++++++++++++++++++++ fstester/getter/os2_32/OS2.MK | 3 + fstester/getter/os2_32/OS2.MK1 | 35 ++++ fstester/getter/os2_32/OS2.SYM | Bin 0 -> 13198 bytes fstester/getter/os2_32/OS2.TGT | 238 ++++++++++++++++++++++ fstester/getter/os2_32/OS2.WPJ | 43 ++++ fstester/getter/os2_32/README.md | 28 +++ 17 files changed, 1174 insertions(+) create mode 100644 fstester/README.md create mode 100644 fstester/getter/README.md create mode 100644 fstester/getter/os2_32/DIR.C create mode 100644 fstester/getter/os2_32/DIR.H create mode 100644 fstester/getter/os2_32/EA.C create mode 100644 fstester/getter/os2_32/EA.H create mode 100644 fstester/getter/os2_32/MAIN.C create mode 100644 fstester/getter/os2_32/MAIN.H create mode 100755 fstester/getter/os2_32/OS2.EXE create mode 100644 fstester/getter/os2_32/OS2.LK1 create mode 100644 fstester/getter/os2_32/OS2.MAP create mode 100644 fstester/getter/os2_32/OS2.MK create mode 100644 fstester/getter/os2_32/OS2.MK1 create mode 100644 fstester/getter/os2_32/OS2.SYM create mode 100644 fstester/getter/os2_32/OS2.TGT create mode 100644 fstester/getter/os2_32/OS2.WPJ create mode 100644 fstester/getter/os2_32/README.md 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 0000000000000000000000000000000000000000..0a4537a2d9a0525b6fc66fb7a7bffe79b3c60e60 GIT binary patch literal 15603 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0d8dd968373196a2e7f525eb7a4ee686d1dbe874 GIT binary patch literal 13198 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 literal 0 HcmV?d00001 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