Click to See Complete Forum and Search --> : How to access ADS(treams)?


Djingis Kan
August 15th, 2001, 09:29 AM
Hi,
I'm looking for a way to access (read/write)Alternate Data Streams (ADS) on a NTFS-Drive.
Can anyone give me code, links or tips how to do this under win2k. I need, at best, code for VB and VC++.

Thanks in advance,
Kan

Djingis Kan
August 17th, 2001, 07:26 AM
So no one knows something about this NTFS-feature?
That's not good!
Even no one knows where I might get an answer (other Board, Person, etc.)?

Thx,
Kan

tanjaklen
November 15th, 2001, 05:11 AM
Hi!
I did some demonstration with ADS. Explanations are in my language (Croatian), so if you need them I can translate them for You. This is very simple code for demonstrating purpose only but it shows how to write and read them. It's in C.
It's not finished because I need to determine the real size of complete file with ADS in it.
Hope I was helpful!
Tanja



#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <iostream>
#include <string>
#define MAXN 255




int WINAPI WinMain (HINSTANCE hinstExe, HINSTANCE hinstPrev,
LPSTR pszCmdLine, int nCmdShow)

{
//varijable za dobivanje podataka o volumenu iz fje GetVolumeInformation

char NazivSustava[MAXN];
char Disk[MAXN];
char ImeVolumena[MAXN];
DWORD SerijskiBroj;
DWORD DuljinaSus;
DWORD Zastavice;

//pomocne - kontrolne varijable

char Provjera[MAXN]="NTFS"; // za usporedbu s NazivSustava
char Direktorij[MAXN]="Test\\"; // ime direktorija u kojem cemo raditi
char Putanja[MAXN]; // putanja direktorija "Test"
int ProvjeraNTFS; // kontrola da li je dat.sustav NTFS

//varijable za rad s datotekom

HANDLE hdat; //potrebno za rukovanje s datotekama
LPCTSTR ImeDat=TEXT("Proba.txt"); //naziv datoteke
LPCTSTR ImeSlijed=TEXT("Proba.txt:Slijed.txt"); //naziv imenovanog slijeda
char TekstZaUpisat[MAXN]="Ovo je tekst unutar imenovanog slijeda";
char TekstZaProcitat[MAXN]={0}; //polje za smještanje procitanog teksta
//kod funkcije ReadFile
DWORD BrUpisanihBajtova; //potrebno za funkciju WriteFile
DWORD VelicinaSlijed;
DWORD VelicinaGlavniTok;

//pocetak rada

printf("\n*****************************************************************");
printf("\n Program za demonstraciju podatkovnih slijedova na NTFS volumenu!\n");
printf("*****************************************************************");
printf("\n\n Na kojem volumenu zelite raditi (format upisa je npr. c:\\):\n\n");
scanf (" %s", &Disk);

//dobivanje informacija o zeljenom volumenu

GetVolumeInformation(
Disk,
ImeVolumena,
MAXN,
&SerijskiBroj,
&DuljinaSus,
&Zastavice,
NazivSustava,
MAXN);
printf("\n Izabrali ste disk s %s datotecnim sustavom.\n", NazivSustava);

//provjera da li je datotecni sustav NTFS

ProvjeraNTFS=strcmp(Provjera, NazivSustava); //usporedjivanje stringova

// ovisno o ProvjeraNTFS nastavlja se s programom ili se on prekida

if (ProvjeraNTFS==0) { //ako nema razlike u stringovima nastavlja se
printf("\n Mozemo nastaviti s demonstracijom datotecnih slijedova.\n");

//kreiranje putanje direktorija za nasu datoteku

strcpy(Putanja, Disk); //dodatna varijabla s istom vrijednoscu kao i Disk
strcat(Putanja, Direktorij); //zadanom disku pridružujem direktorij Test
printf("\n Direktorij s kojim radimo je: %s.\n", Putanja);

//kreiranje direktorija sa zadanom putanjom

CreateDirectory( //API funkcija prima 2 argumenta:
Putanja, //putanja i naziv direktorija
NULL); //atributi sigurnosti, u ovom slucaju defaultni

//postavljanje aktivnog direktorija u kojem cemo raditi

SetCurrentDirectory( //ova funkcija prima samo jedan argument
Putanja);

//kreiranje datoteke Proba.txt koja je prazna ujedno je to i glavni, neimenovani slijed

hdat=CreateFile( //funkcija za kreiranje datoteke s argumentima:
ImeDat, //naziv datoteke
GENERIC_WRITE, //mod pristupa
0, //mod dijeljena resursa(share mode)
NULL, //atribut zastite
CREATE_ALWAYS, // ako vec postoji obrisi i kreiraj ponovo
FILE_ATTRIBUTE_NORMAL, //atributi kao sto su: readonly,archive,hidden...
NULL); //veza prema template-datoteci koja sadrzi
//atribute za datoteku koja se kreira
CloseHandle (hdat);

// datoteka je kreirana, a sad dolazi provjera da li je stvarno tako

printf("\n Kreirana je datoteka Proba.txt, ali bez podataka.\n");
printf("\n Naredbom dir dobivamo ovaj ispis direktorija Test:\n\n");
printf("--------------------------------------------------------\n");
system("dir *.txt");
printf("--------------------------------------------------------\n");

//kreiranje imenovanog slijeda unutar datoteke Proba.txt i upisivanje
//jednog niza znakova u slijed

hdat=CreateFile( //svi argumenti su isti osim naziva
ImeSlijed,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
WriteFile(
hdat,
(PVOID)TekstZaUpisat,
strlen(TekstZaUpisat),
&BrUpisanihBajtova,
NULL);
CloseHandle (hdat);

//ovime je kreiran slijed i upisan je tekst
//sad je potrebno to i provijeriti i to pomoću Notepad-a

printf("\n Slijed je kreiran i upisan je tekst.\n");
printf("\n Za provjeru koristimo Notepad\n");
printf("--------------------------------------------------------\n");
system(" Notepad Proba.txt:Slijed.txt");

//sad smo sigurni da podaci postoje, pa provjerimo jos i naredbom dir

printf("\n Da vidimo kolika je velicina datoteke: \n");
printf("--------------------------------------------------------\n");
system("dir *.txt");
printf("--------------------------------------------------------\n");
printf("\n Naredba dir ne prepoznaje slijedove i ne vidi stvarnu");
printf(" velicinu datoteke!\n");

// Funkcijom GetFileSize utvrdit cemo velicinu imenovanog slijeda

hdat=CreateFile(
ImeSlijed,
0,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
VelicinaSlijed=GetFileSize( //trazimo velicinu slijeda
hdat,
NULL);
CloseHandle (hdat);

// sad trazimo i velicinu glavnog toka

hdat=CreateFile(
ImeDat,
0,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
VelicinaGlavniTok=GetFileSize(
hdat,
NULL);
CloseHandle (hdat);

//sto smo dobili

printf("\n Velicina glavnog toka iznosi %ld bajta.\n", VelicinaGlavniTok);
printf("\n Velicina slijeda iznosi %ld bajta.\n ", VelicinaSlijed);
}