1. Homepage
  2. Programming
  3. CS202 Operating Systems - Lab 4: File Recovery

CS202 Operating Systems - Lab 4: File Recovery

Engage in a Conversation
NYUCS202Operating SystemsFile RecoveryCFAT

FAT has been around for nearly 50 years. Because of its simplicity, it is the most widely compatible le system. Although recent computers have adopted newer le systems, FAT32 (and its variant, exFAT) is still dominant in SD cards and USB ash drives due to its compatibility. CourseNana.COM

Have you ever accidentally deleted a le? Do you know that it could be recovered? In this lab, you will build a FAT32 le recovery tool called Need You to Undelete my FILE, or for short. CourseNana.COM

Through this lab, you will: CourseNana.COM

Learn the internals of the FAT32 le system.
Learn how to access and recover les from a raw disk.
Get a better understanding of key le system concepts.
Be a better C programmer. Learn how to write code that manipulates data at the byte level and understand the alignment issue.
CourseNana.COM

In this lab, you will work on the data stored in the FAT32 le system directly, without the OS le system support. You will implement a tool that recovers a deleted le specied by the user. CourseNana.COM

For simplicity, you can assume that the deleted le is in the root directory. Therefore, you don’t need to search subdirectories. CourseNana.COM

Before going through the details of this lab, let’s rst create a FAT32 disk image. Follow these steps: CourseNana.COM

On Linux, is a special le that provides as many \0 as are read from it. The dd command performs low-level copying of raw data. Therefore, you can use it to generate an arbitrary-size le full of zeros. CourseNana.COM

For example, to create a 256KB empty le named : CourseNana.COM

Read for its usage. You will use this le as the disk image. CourseNana.COM

You can use the command to create a FAT32 le system. The most basic usage is: CourseNana.COM

(You can ignore the warning of not enough clusters.) You can specify a variety of options. For example: CourseNana.COM

Here are the meanings of each option: CourseNana.COM

-F : type of FAT (FAT12, FAT16, or FAT32). CourseNana.COM

/dev/zero CourseNana.COM

fat32.disk CourseNana.COM

[root@... cs202]# dd if=/dev/zero of=fat32.disk bs=256k count=1

mkfs.fat CourseNana.COM

[root@... cs202]# mkfs.fat -F 32 fat32.disk
[root@... cs202]# mkfs.fat -F 32 -f 2 -S 512 -s 1 -R 32 fat32.disk

https://cs.nyu.edu/courses/fall24/CSCI-UA.0202-001/nyufile CourseNana.COM

11/15/24, 7:22 PM Lab 4: File Recovery CourseNana.COM

-f : number of FATs.
-S : number of bytes per sector. -s : number of sectors per cluster. -R : number of reserved sectors. CourseNana.COM

The command can check and repair FAT le systems. You can invoke it with -v to see the FAT details. For example: CourseNana.COM

You can see that there are 2 FATs, 512 bytes per sector, 512 bytes per cluster, and 32 reserved sectors. These numbers match our specied options in Step 2. You can try different options yourself. CourseNana.COM

fsck.fat CourseNana.COM

[root@... cs202]# fsck.fat -v fat32.disk
fsck.fat 4.1 (2017-01-24)
Checking we can access the last sector of the filesystem
Warning: Filesystem is FAT32 according to fat_length and fat32_length fields,
  but has only 472 clusters, less than the required minimum of 65525.
  This may lead to problems on some systems.
Boot sector contents:
System ID "mkfs.fat"
Media byte 0xf8 (hard disk)
       512 bytes per logical sector
       512 bytes per cluster
        32 reserved sectors
First FAT starts at byte 16384 (sector 32)
         2 FATs, 32 bit entries
      2048 bytes per FAT (= 4 sectors)
Root directory start at cluster 2 (arbitrary size)
Data area starts at byte 20480 (sector 40)
       472 data clusters (241664 bytes)
32 sectors/track, 64 heads
         0 hidden sectors
       512 sectors total
Checking for unused clusters.
Checking free cluster summary.
fat32.disk: 0 files, 1/472 clusters

You can use the command to mount a le system to a mount point. The mount point can be any empty directory. For example, you can create one at /mnt/disk : CourseNana.COM

Then, you can mount at that mount point: CourseNana.COM

After the le system is mounted, you can do whatever you like on it, such as creating les, editing les, or deleting les. In order to avoid the hassle of having long lenames in your directory entries, it is recommended that you use only 8.3 lenames, which means: CourseNana.COM

The lename contains at most eight characters, followed optionally by a CourseNana.COM

. andatmostthreemorecharacters.
The lename contains only
uppercase letters, numbers, and the following special characters: . CourseNana.COM

For example, you can create a le named : CourseNana.COM

For the purpose of this lab, after you write anything to the disk, make sure to ush the le system cache using the sync command: CourseNana.COM

[root@... cs202]# mkdir /mnt/disk

fat32.disk CourseNana.COM

[root@... cs202]# mount fat32.disk /mnt/disk

! # $ % &' ( )- @^ _ `{ }~ CourseNana.COM

HELLO.TXT CourseNana.COM

[root@... cs202]# echo "Hello, world." > /mnt/disk/HELLO.TXT
[root@... cs202]# mkdir /mnt/disk/DIR
[root@... cs202]# touch /mnt/disk/EMPTY

(Otherwise, if you create a le and immediately delete it, the le may not be written to the disk at all and is unrecoverable.) CourseNana.COM

When you nish playing with the le system, you can unmount it: CourseNana.COM

You can examine the le system using the xxd command. You can specify a range using the -s (starting offset) and -l (length) options. CourseNana.COM

For example, to examine the root directory: CourseNana.COM

(It’s normal that the bytes containing timestamps are different from the example above.) CourseNana.COM

To examine the contents of : CourseNana.COM

[root@... cs202]# umount /mnt/disk

metsys el eht enimaxe :7 petS CourseNana.COM

metsys el eht tnuomnu :6 petS CourseNana.COM

[root@... cs202]# xxd -s 20480 -l 96 fat32.disk
00005000: 4845 4c4c 4f20 2020 5458 5420 0000 0000  HELLO   TXT ....
00005010: 6e53 6e53 0000 0000 6e53 0300 0e00 0000  nSnS....nS......
00005020: 4449 5220 2020 2020 2020 2010 0000 0000  DIR        .....
00005030: 6e53 6e53 0000 0000 6e53 0400 0000 0000  nSnS....nS......
00005040: 454d 5054 5920 2020 2020 2020 0000 0000  EMPTY       ....
00005050: 6e53 6e53 0000 0000 6e53 0000 0000 0000  nSnS....nS......

HELLO.TXT CourseNana.COM

[root@... cs202]# xxd -s 20992 -l 14 fat32.disk
0005200: 4865 6c6c 6f2c 2077 6f72 6c64 2e0a       Hello, world..
[root@... cs202]# sync

Note that the offsets may vary depending on how the le system is formatted. CourseNana.COM

Important: before running your program, please make sure that your FAT32 disk is unmounted. CourseNana.COM

There are several ways to invoke your program. Here is its usage: CourseNana.COM

The rst argument is the lename of the disk image. After that, the options can be one of the following: CourseNana.COM

-i -l CourseNana.COM

You need to check if the command-line arguments are valid. If not, your program should print the above usage information verbatim and exit. CourseNana.COM

If your program is invoked with option -i , it should print the following information about the FAT32 le system: CourseNana.COM

nyufile CourseNana.COM

nyufile CourseNana.COM

[root@... cs202]# ./nyufile
Usage: ./nyufile disk <options>
  -i                     Print the file system information.
  -l                     List the root directory.
  -r filename [-s sha1]  Recover a contiguous file.
  -R filename -s sha1    Recover a possibly non-contiguous file.

-r filename CourseNana.COM

-r filename -s sha1
-R filename -s sha1

nyufile CourseNana.COM

Number of FATs;
Number of bytes per sector; Number of sectors per cluster; Number of reserved sectors.
CourseNana.COM

Your output should be in the following format: CourseNana.COM

For all milestones, you can assume that CourseNana.COM

is invoked while the disk is CourseNana.COM

unmounted.
If your program is invoked with option
-l , it should list all valid CourseNana.COM

entries in the root directory with the following information: CourseNana.COM

Filename. Similar to /bin/ls -p , if the entry is a directory, you should append a / indicator. CourseNana.COM

File size if the entry is a le (not a directory). Starting cluster if the entry is not an empty le. CourseNana.COM

You should also print the total number of entries at the end. Your output should be in the following format: CourseNana.COM

Here are a few assumptions: CourseNana.COM

[root@... cs202]# ./nyufile fat32.disk -i
Number of FATs = 2
Number of bytes per sector = 512
Number of sectors per cluster = 1
Number of reserved sectors = 32

nyufile CourseNana.COM

nyufile CourseNana.COM

[root@... cs202]# ./nyufile fat32.disk -l
HELLO.TXT (size = 14, starting cluster = 3)
DIR/ (starting cluster = 4)
EMPTY (size = 0)
Total number of entries = 3

You should not list entries marked as deleted.
You don’t need to print the details inside subdirectories.
For all milestones, there will be no
long lename (LFN) entries. (If you have accidentally created LFN entries when you test your program, don’t worry. You can just skip the LFN entries and print only the 8.3 lename entries.)
Any le or directory, including the root directory, may span
more than one cluster.
There may be
empty les. CourseNana.COM

If your program is invoked with option , it should recover the deleted le with the specied name. The workow is better illustrated through an example: CourseNana.COM

For all milestones, you only need to recover regular les (including empty les, but not directory les) in the root directory. When the le is successfully recovered, your program should print CourseNana.COM

(replace with the actual le CourseNana.COM

name). CourseNana.COM

For all milestones, you can assume that no other les or directories are created or modied since the deletion of the target le. However, multiple les may be deleted. CourseNana.COM

Besides, for all milestones, you don’t need to update the structure because most operating systems don’t care about it. CourseNana.COM

filename: successfully recovered

filename CourseNana.COM

[root@... cs202]# mount fat32.disk /mnt/disk
[root@... cs202]# ls -p /mnt/disk
DIR/  EMPTY  HELLO.TXT
[root@... cs202]# cat /mnt/disk/HELLO.TXT
Hello, world.
[root@... cs202]# rm /mnt/disk/HELLO.TXT
rm: remove regular file '/mnt/disk/HELLO.TXT'? y
[root@... cs202]# ls -p /mnt/disk
DIR/  EMPTY
[root@... cs202]# umount /mnt/disk
[root@... cs202]# ./nyufile fat32.disk -l
DIR/ (starting cluster = 4)
EMPTY (size = 0)
Total number of entries = 2
[root@... cs202]# ./nyufile fat32.disk -r HELLO
HELLO: file not found
[root@... cs202]# ./nyufile fat32.disk -r HELLO.TXT
HELLO.TXT: successfully recovered
[root@... cs202]# ./nyufile fat32.disk -l
HELLO.TXT (size = 14, starting cluster = 3)
DIR/ (starting cluster = 4)
EMPTY (size = 0)
Total number of entries = 3
[root@... cs202]# mount fat32.disk /mnt/disk
[root@... cs202]# ls -p /mnt/disk
DIR/  EMPTY  HELLO.TXT
[root@... cs202]# cat /mnt/disk/HELLO.TXT
Hello, world.

Here are a few assumptions specically for Milestone 4: CourseNana.COM

The size of the deleted le is no more than the size of a cluster.
At most one deleted directory entry matches the given lename. If no such entry exists, your program should print
(replace with the actual le name).
CourseNana.COM

Now, you will recover a le that is larger than one cluster. Nevertheless, for Milestone 5, you can assume that such a le is allocated contiguously. You can continue to assume that at most one deleted directory entry matches the given lename. If no such entry exists, your program should print CourseNana.COM

(replace with the actual le name). CourseNana.COM

In Milestones 4 and 5, you assumed that at most one deleted directory entry matches the given lename. However, multiple les whose names differ only in the rst character would end up having the same name when deleted. Therefore, you may encounter more than one deleted directory entry matching the given lename. When that happens, your program should print (replace with the actual le name) and abort. CourseNana.COM

This scenario is illustrated in the following example: CourseNana.COM

filename: file not found

filename CourseNana.COM

filename: file not found

filename CourseNana.COM

filename: multiple candidates found

filename CourseNana.COM

[root@... cs202]# mount fat32.disk /mnt/disk
[root@... cs202]# echo "My last name is Tang." > /mnt/disk/TANG.TXT
[root@... cs202]# echo "My first name is Yang." > /mnt/disk/YANG.TXT
[root@... cs202]# sync
[root@... cs202]# rm /mnt/disk/TANG.TXT /mnt/disk/YANG.TXT
rm: remove regular file '/mnt/disk/TANG.TXT'? y
rm: remove regular file '/mnt/disk/YANG.TXT'? y
[root@... cs202]# umount /mnt/disk
[root@... cs202]# ./nyufile fat32.disk -r TANG.TXT
TANG.TXT: multiple candidates found

hsah 1-AHS CourseNana.COM

To solve the aforementioned ambiguity, the user can provide a SHA-1 hash via command-line option to help identify which deleted directory entry should be the target le.
CourseNana.COM

In short, a SHA-1 hash is a 160-bit ngerprint of a le, often represented as 40 hexadecimal digits. For the purpose of this lab, you can assume that identical les always have the same SHA-1 hash, and different les always have vastly different SHA-1 hashes. Therefore, even if multiple candidates are found during recovery, at most one will match the given SHA-1 hash. CourseNana.COM

This scenario is illustrated in the following example: CourseNana.COM

When the le is successfully recovered with SHA-1, your program should print (replace with the actual le name). CourseNana.COM

Note that you can use the command to compute the SHA-1 hash of a le: CourseNana.COM

-s sha1 CourseNana.COM

[root@... cs202]# ./nyufile fat32.disk -r TANG.TXT -s c91761a2cc1562d36585614
TANG.TXT: successfully recovered with SHA-1
[root@... cs202]# ./nyufile fat32.disk -l
HELLO.TXT (size = 14, starting cluster = 3)
DIR/ (starting cluster = 4)
EMPTY (size = 0)
TANG.TXT (size = 22, starting cluster = 5)
Total number of entries = 4
filename: successfully recovered with SHA-1

filename CourseNana.COM

sha1sum CourseNana.COM

[root@... cs202]# sha1sum /mnt/disk/TANG.TXT
c91761a2cc1562d36585614c8c680ecf5712e875  /mnt/disk/TANG.TXT

Also note that it is possible that the le is empty or occupies only one cluster. The SHA-1 hash for an empty le is CourseNana.COM

. CourseNana.COM

If no such le matches the given SHA-1 hash, your program should print (replace with the actual le name). For CourseNana.COM

example: CourseNana.COM

The OpenSSL library provides a function , which computes the SHA- 1 hash of and stores the result in : CourseNana.COM

You need to add the linker option to link with the OpenSSL library. CourseNana.COM

Finally, the clusters of a le are no longer assumed to be contiguous. You have to try every permutation of unallocated clusters on the le system in order to nd the one that matches the SHA-1 hash. CourseNana.COM

The command-line option is . The SHA-1 hash must be given. CourseNana.COM

Note that it is possible that the le is empty or occupies only one cluster. If so, -R behaves the same as -r , as described in Milestone 7. CourseNana.COM

da39a3ee5e6b4b0d3255bfef95601890afd80709
filename: file not found

filename CourseNana.COM

[root@... cs202]# ./nyufile fat32.disk -r TANG.TXT -s 0123456789abcdef0123456
TANG.TXT: file not found

d[0...n-1] CourseNana.COM

md[0...SHA_DIGEST_LENGTH-1]

#include <openssl/sha.h>
#define SHA_DIGEST_LENGTH 20
unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md); CourseNana.COM

-lcrypto CourseNana.COM

-R filename -s sha1 CourseNana.COM

For Milestone 8, you can assume that the entire le is within the rst 20 clusters, and the le content occupies no more than 5 clusters, so a brute- force search is feasible. CourseNana.COM

If you cannot nd a le that matches the given SHA-1 hash, your program should print (replace with the actual le name). CourseNana.COM

For your convenience, here are some data structures that you can copy and paste. Please refer to the lecture slides and FAT: General Overview of On- Disk Format for details on the FAT32 le system layout. CourseNana.COM

filename: file not found

filename CourseNana.COM

rotces tooB CourseNana.COM

#pragma pack(push,1) typedef struct BootEntry { CourseNana.COM

unsigned char BS_jmpBoot[3]; unsigned char BS_OEMName[8]; unsigned short BPB_BytsPerSec; unsigned char BPB_SecPerClus; unsigned short BPB_RsvdSecCnt; unsigned char BPB_NumFATs; unsigned short BPB_RootEntCnt; unsigned short BPB_TotSec16; unsigned char BPB_Media; unsigned short BPB_FATSz16; unsigned short BPB_SecPerTrk; unsigned short BPB_NumHeads; CourseNana.COM

// Assembly instruction to jump to boot c
// OEM Name in ASCII
// Bytes per sector. Allowed values inclu
// Sectors per cluster (data unit). Allow
// Size in sectors of the reserved area
// Number of FATs
// Maximum number of files in the root di
// 16-bit value of number of sectors in f
// Media type
// 16-bit size in sectors of each FAT for
// Sectors per track of storage device
// Number of heads in storage device
// Number of sectors before the start of
// 32-bit value of number of sectors in f
// 32-bit size in sectors of one FAT
// A flag for FAT
// The major and minor version number
// Cluster where the root directory can b
// Sector where FSINFO structure can be f
// Sector where backup copy of boot secto

unsigned int
unsigned int
unsigned int
unsigned short
BPB_ExtFlags;
unsigned short BPB_FSVer;
unsigned int BPB_RootClus;
unsigned short BPB_FSInfo;
unsigned short BPB_BkBootSec;
unsigned char BPB_Reserved[12]; // Reserved CourseNana.COM

} BootEntry; #pragma pack(pop) CourseNana.COM

BPB_HiddSec;
BPB_TotSec32;
BPB_FATSz32;

unsigned char BS_DrvNum;
unsigned char BS_Reserved1;
unsigned char BS_BootSig;
unsigned int BS_VolID;
unsigned char BS_VolLab[11];
unsigned char BS_FilSysType[8]; // File system type label in ASCII CourseNana.COM

// BIOS INT13h drive number
// Not used
// Extended boot signature to identify if
// Volume serial number
// Volume label in ASCII. User defines wh

https://cs.nyu.edu/courses/fall24/CSCI-UA.0202-001/nyufile CourseNana.COM

11/15/24, 7:22 PM Lab 4: File Recovery CourseNana.COM

#pragma pack(push,1) typedef struct DirEntry { CourseNana.COM

unsigned char DIR_Name[11];
unsigned char DIR_Attr;
unsigned char DIR_NTRes;
unsigned char DIR_CrtTimeTenth; // Created time (tenths of second) CourseNana.COM

  unsigned short DIR_CrtTime;
  unsigned short DIR_CrtDate;
  unsigned short DIR_LstAccDate;
  unsigned short DIR_FstClusHI;
  unsigned short DIR_WrtTime;
  unsigned short DIR_WrtDate;
  unsigned short DIR_FstClusLO;
  unsigned int   DIR_FileSize;

} DirEntry; #pragma pack(pop) CourseNana.COM

// Created time (hours, minutes, seconds)
// Created day
// Accessed day
// High 2 bytes of the first cluster addr
// Written time (hours, minutes, seconds
// Written day
// Low 2 bytes of the first cluster addre
// File size in bytes. (0 for directories
// File name
// File attributes
// Reserved

We will grade your submission in an x86_64 Rocky Linux 8 container on Gradescope. We will compile your program using gcc 12.1.1 with the C17 standard and GNU extensions. CourseNana.COM

You must provide a executable le named you need to add example of the CourseNana.COM

, and by running make , it should generate an in the current working directory. Note that CourseNana.COM

to your . (Refer to Lab 1 for an CourseNana.COM

.) CourseNana.COM

To get started with testing, you can download a sample FAT32 disk and expand it with the following command: CourseNana.COM

Makefile CourseNana.COM

nyufile CourseNana.COM

LDFLAGS=-lcrypto

Makefile CourseNana.COM

Makefile CourseNana.COM

gnitseT CourseNana.COM

noitalipmoC CourseNana.COM

yrtne yrotceriD CourseNana.COM

[root@... cs202]# unxz fat32.disk.xz

https://cs.nyu.edu/courses/fall24/CSCI-UA.0202-001/nyufile CourseNana.COM

11/15/24, 7:22 PM Lab 4: File Recovery CourseNana.COM

There are a few les on this disk: CourseNana.COM

– a small text le. DIR –anemptydirectory. – an empty le. CourseNana.COM

– a large contiguously-allocated le.
– a large non-contiguously allocated le.
CourseNana.COM

You should make your own test cases and test your program thoroughly. Make sure to test your program with disks formatted with different parameters. CourseNana.COM

We are providing a sample autograder with a few test cases. Please extract them in your Docker container and follow the instructions in the
le.
(Refer to Lab 1 for how to extract a le.) CourseNana.COM

Note that the test cases are not exhaustive. The numbered test cases on Gradescope are the same as those in the sample autograder, while the lettered test cases are “hidden” test cases that will not be disclosed. If your program passed the former but failed the latter, please double-check if it can handle all corner cases correctly. Do not try to hack or exploit the autograder. CourseNana.COM

You must submit a .zip archive containing all les needed to compile
in the root of the archive. You can create the archive le with the
CourseNana.COM

following command in the Docker container: CourseNana.COM

Note that other le formats (e.g., rar ) will not be accepted. CourseNana.COM

HELLO.TXT CourseNana.COM

EMPTY.TXT CourseNana.COM

CONT.TXT CourseNana.COM

NON_CONT.TXT

.tar.xz CourseNana.COM

noissimbuS CourseNana.COM

redargotua ehT CourseNana.COM

nyufile CourseNana.COM

$ zip nyufile.zip Makefile *.h *.c

https://cs.nyu.edu/courses/fall24/CSCI-UA.0202-001/nyufile CourseNana.COM

11/15/24, 7:22 PM Lab 4: File Recovery CourseNana.COM

You need to upload the .zip archive to Gradescope. If you need to acknowledge any inuences per our academic integrity policy, write them as comments in your source code. CourseNana.COM

The total of this lab is 100 points, mapped to 15% of your nal grade of this course. CourseNana.COM

Milestone 1: validate usage. (40 points)
Milestone 2: print the le system information. (5 points)
Milestone 3: list the root directory. (10 points)
Milestone 4: recover a small le. (15 points)
Milestone 5: recover a large contiguously-allocated le. (10 points) Milestone 6: detect ambiguous le recovery requests. (5 points) Milestone 7a: recover a small le with SHA-1 hash. (5 points) Milestone 7b: recover a large contiguously-allocated le with SHA-1 hash. (5 points)
Milestone 8: recover a non-contiguously allocated le. (5 points)
CourseNana.COM

This lab requires signicant programming effort. Therefore, start as early as possible! Don’t wait until the last week. CourseNana.COM

Before you start, use xxd to examine the disk image to get an idea of the FAT32 layout. Keep a backup of the hexdump.
After you create a le or delete a le, use
xxd to compare the hexdump of the disk image against your backup to see what has changed. CourseNana.COM

You can also use to convert a hexdump back to a binary le. You can use it to “hack” a disk image. In this way, you can try recovering a le CourseNana.COM

manually before writing a program to do it. You can also create a non- contiguously allocated le articially for testing in this way.
Always
umount before using xxd or running your program. When updating FAT, remember to update all FATs. CourseNana.COM

Using to access the disk image is more convenient than
or . You may need to open the disk image with and map
CourseNana.COM

it with
underlying le. Once you have mapped your disk image, you can cast any address to the FAT32 data structure type, such as
CourseNana.COM

and in order to update the . You can also cast the FAT to CourseNana.COM

for easy access.
The milestones have
diminishing returns. Easier milestones are worth CourseNana.COM

more points. Make sure you get them right before trying to tackle the harder ones. CourseNana.COM

This lab has borrowed some ideas from Dr. T. Y. Wong. CourseNana.COM

nyufile CourseNana.COM

fread() CourseNana.COM

PROT_READ | PROT_WRITE

MAP_SHARED CourseNana.COM

(DirEntry *)(mapped_address + 0x5000)

Get in Touch with Our Experts

WeChat (微信) WeChat (微信)
Whatsapp WhatsApp
NYU代写,CS202代写,Operating Systems代写,File Recovery代写,C代写,FAT代写,NYU代编,CS202代编,Operating Systems代编,File Recovery代编,C代编,FAT代编,NYU代考,CS202代考,Operating Systems代考,File Recovery代考,C代考,FAT代考,NYUhelp,CS202help,Operating Systemshelp,File Recoveryhelp,Chelp,FAThelp,NYU作业代写,CS202作业代写,Operating Systems作业代写,File Recovery作业代写,C作业代写,FAT作业代写,NYU编程代写,CS202编程代写,Operating Systems编程代写,File Recovery编程代写,C编程代写,FAT编程代写,NYUprogramming help,CS202programming help,Operating Systemsprogramming help,File Recoveryprogramming help,Cprogramming help,FATprogramming help,NYUassignment help,CS202assignment help,Operating Systemsassignment help,File Recoveryassignment help,Cassignment help,FATassignment help,NYUsolution,CS202solution,Operating Systemssolution,File Recoverysolution,Csolution,FATsolution,