after reading this : http://msdn.microsof...bedded.60).aspx
the filter seems to need a real hd and all writtings are done in memory...
how much memory has your computer ?
in order to get "same" results as you seem to want , i would do like this :
first have a computer with 16 Go or ram or more
then do an install of win7 in a vhd of 40-60 Go
update...then remove as much files as you can....plus set disks shares
then under an other windows you mount the vhd , defrag it and then reduce its size ....my current result is 6656 Mo : the os plus 400-500 Mo of free space , win7 x64 is able to run with 4 G0 so free space can be higher . my pc is file server so i prefer file cache aka smartdrv to eat memory
then you can lzma the vhd if you load it using grub4dos in ram ....[ that should be possible from the network to , never tried ..]
them all changes of the windows are in memory and you have a fresh wiwi at each boot
good luck
That will be a huge requirement and may not be feasible for Computer Shops. I tried testing Dokan (JDokan since I'm more on Java), the result was good if I do copy on write but that will be a server based and it almost eats up 1G per client machine. Of course not good for 20 units or more. That is why I'm looking into patching winaoe driver (from winaoe.org). I think EWF is promising since this is Sector based cache and also from client side, but I wonder if this is fine with both winaoe and ewf both on client. I tried putting up this code for winaoe but haven't tested it yet. I will share it here, maybe a C++ programmer can verify if this will work (I'm new in C++). I'm planning to call the code before AoeRequest Read and Write. I think this is same with EWF as sector based cache. If this was Java, then I think I can easily do this.
#include <cstring>
#include <iostream>
#include <stdio.h>
#include <stdbool.h>
using namespace std;
static int count = 0;
static int SECTORSIZE = 512;
enum WRITE_CONTENTS {
ALL_WRITE,
CONTAINS_WRITE,
NO_WRITE
};
struct _CACHE {
long offset;
char data[];
} *SectorCache;
WRITE_CONTENTS checkCachWrite(long startSector, long sectorCount) {
bool hasWrites = false;
bool hasNoWrites = false;
long myOffset = startSector;
for (int i=0; i<sectorCount; i++) {
myOffset += SECTORSIZE*i;
_CACHE b = getCacheFromSector(myOffset);
if (b != NULL) {
hasWrites = true;
}
else if (b == NULL) {
hasNoWrites = true;
}
}
if (hasWrites && hasNoWrites) {
return CONTAINS_WRITE;
}
else if (hasWrites) {
return ALL_WRITE;
}
else {
return NO_WRITE;
}
}
//call this on CONTAINS_WRITE and ALL_WRITE only
char *getData(long startSector, long sectorCount, PUCHAR buffer, _CACHE cacheType) {
char *data;
if (cacheType != NO_WRITE) {
long myOffset = startSector;
for (int i=0; i<sectorCount; i++) {
myOffset += SECTORSIZE*i;
_CACHE b = getCacheFromSector(myOffset);
if (b == NULL) {
b = new _CACHE();
SectorCache[count++] = b;
b.offset = myOffset;
RtlCopyMemory(b.data, &buffer[myOffset], SECTORSIZE);
}
strncat(data, b.data, sizeof(b.data));
}
}
return data;
}
void putData(long startSector, long sectorCount, PUCHAR buffer) {
long myOffset = startSector;
for (int i=0; i<sectorCount; i++) {
myOffset += SECTORSIZE*i;
_CACHE b = getCacheFromSector(myOffset);
if (b == NULL) {
b = new _CACHE();
SectorCache[count++] = b;
b.offset = myOffset;
}
RtlCopyMemory(b.data, &buffer[myOffset], SECTORSIZE);
}
}
_CACHE getCacheFromSector(int offset) {
_CACHE b;
for (int i=0; i<count; i++) {
if (SectorCache[i].offset == offset) {
b = SectorCache[i];
break;
}
}
return b;
}
Edited by amiranda, 24 September 2014 - 07:12 AM.