[Back to NETWORK SWAG index] [Back to Main SWAG index] [Original]
{
ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
º ÚËÍÍÍË¿ÚËÍÍÍË¿ÚËÍÍÍË¿ÚËÍ» Ë¿ÚËÍÍÍË¿ÚÉÍËÍ»¿ º
º ³ÌÍÍÍÊÙÃÎÍÍÍδÀÊÍÍÍË¿³º º º³ÃÎÍÍ º º
º ÀÊ ÀÊ ÊÙÀÊÍÍÍÊÙÀÊ ÈÍÊÙÀÊÍÍÍÊÙ Ê º
º º
º NetWare 3.11 API Library for Turbo Pascal º
º by º
º S.Perevoznik º
º 1996 º
ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
}
Unit NetFile;
Interface
Uses NetConv;
Const
TA_NONE = $00;
TA_READ = $01;
TA_WRITE = $02;
TA_OPEN = $04;
TA_CREATE = $08;
TA_DELETE = $10;
TA_OWNERSHIP = $20;
TA_SEARCH = $40;
TA_MODIFY = $80;
TA_ALL = $FF;
Const
FA_NORMAL = $00;
FA_READ_ONLY = $01;
FA_HIDDEN = $02;
FA_SYSTEM = $04;
FA_EXECUTE_ONLY = $08;
FA_DIRECTORY = $10;
FA_NEEDS_ARCHIVED = $20;
FA_SHAREABLE = $80;
Const
FA_TRANSACTIONAL = $10;
FA_INDEXED = $20;
FA_READ_AUDIT = $40;
FA_WRITE_AUDIT = $80;
Function CreateDirectory( DirectoryHandle : byte;
DirectoryPath : string;
MaximumRightsMask : byte) : byte;
Function DeleteDirectory( DirectoryHandle : byte;
DirectoryPath : string) : byte;
Function RenameDirectory( DirectoryHandle : byte;
DirectoryPath : string;
NewDirectoryName : string):byte;
Function SetDirectoryInformation( DirectoryHandle : byte;
DirectoryPath : string;
NewCreationDateAndTime : longint;
NewOwnerObjectID : LongInt;
NewMaximumRightsMask : byte) : byte;
Function GetDirectoryPath(DirectoryHandle : byte;
Var directoryPath : string) : byte;
Function GetVolumeNumber(VolumeName : string;
Var VolumeNumber : integer) : byte;
Function GetVolumeName(VolumeNumber : integer;
Var VolumeName : string) : byte;
Function PurgeErasedFiles : byte;
Function RestoreErasedFile(DriveHandle : byte;
VolumeName : string;
Var ErasedFileName ,
RestoredFileName : string) : byte;
Function GetDirectoryHandle(Drive : byte;
Var Handle : byte) : byte;
Function SaveDirectoryHandle(DirectoryHandle : byte;
Var SaveBuffer : String) : byte;
Function RestoreDirectoryHandle(SaveBuffer : string;
Var newDirectoryHandle : byte;
Var EffectiveRigthMask : Byte) : byte;
Function SetFileInformation( driveHandle : byte;
filePath : string;
searchAttributes : byte;
fileAttributes : byte;
extendedFileAttributes : byte;
creationDate : integer;
lastAccessDate : integer;
lastUpdateDateAndTime : LongInt;
lastArchiveDateAndTime : LongInt;
fileOwnerID : LongInt) : byte;
Function GetExtendedFileAttributes(FilePath : string;
Var Attr : byte) : byte;
Function SetExtendedFileAttributes(FilePath : string;
attr : byte) : byte;
Function AllocPermanentDirectoryHandle(DirectoryHandle:Byte;
DirectoryPath :string;
DriveLetter :char;
Var NewDirectoryHandle,
EffectiveRigthMask : byte):byte;
Function AllocTemporaryDirectoryHandle(DirectoryHandle:Byte;
DirectoryPath :string;
DriveLetter :char;
Var NewDirectoryHandle,
EffectiveRigthMask : byte):byte;
Procedure DeallocateDirectoryHandle(DirectoryHandle : byte);
Implementation
Uses Dos;
Function CreateDirectory( DirectoryHandle : byte;
DirectoryPath : string;
MaximumRightsMask : byte) : byte;
var
r : registers;
SendPacket : array[0..261] of byte;
ReplyPacket : array[0..2] of byte;
WordPtr : ^word;
begin
SendPacket[2] := 10;
SendPacket[3] := directoryHandle;
SendPacket[4] := maximumRightsMask;
SendPacket[5] := Length(DirectoryPath);
Move(DirectoryPath[1],SendPacket[6],Length(DirectoryPath));
WordPtr := addr(SendPacket);
WordPtr^ := Length(DirectoryPath)+4;
WordPtr := addr(ReplyPacket);
WordPtr^ := 0;
r.BX := r.DS;
r.AH := $0E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
CreateDirectory := r.AL;
end;
Function DeleteDirectory( DirectoryHandle : byte;
DirectoryPath : string) : byte;
var
r : registers;
SendPacket : array[0..261] of byte;
ReplyPacket : array[0..2] of byte;
WordPtr : ^word;
begin
SendPacket[2] := 11;
SendPacket[3] := directoryHandle;
SendPacket[4] := 0;
SendPacket[5] := Length(DirectoryPath);
Move(DirectoryPath[1],SendPacket[6],Length(DirectoryPath));
WordPtr := addr(SendPacket);
WordPtr^ := Length(DirectoryPath)+4;
WordPtr := addr(ReplyPacket);
WordPtr^ := 0;
r.BX := r.DS;
r.AH := $0E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
DeleteDirectory := r.AL;
end;
Function RenameDirectory( DirectoryHandle : byte;
DirectoryPath : string;
NewDirectoryName : string):byte;
var
r : registers;
SendPacket : array[0..275] of byte;
ReplyPacket : array[0..2] of byte;
WordPtr : ^word;
begin
SendPacket[2] := 15;
SendPacket[3] := directoryHandle;
SendPacket[4] := Length(DirectoryPath);
Move(DirectoryPath[1],SendPacket[5],Length(DirectoryPath));
SendPacket[Length(DirectoryPath)+5] := Length(NewDirectoryName);
move(NewDirectoryName[1],SendPacket[6+Length(DirectoryPath)],Length(NewDirectoryName));
WordPtr := addr(SendPacket);
WordPtr^ := Length(DirectoryPath)+4 + Length(NewDirectoryName);
WordPtr := addr(ReplyPacket);
WordPtr^ := 0;
r.BX := r.DS;
r.AH := $0E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
REnameDirectory := r.AL;
end;
Function SetDirectoryInformation( DirectoryHandle : byte;
DirectoryPath : string;
NewCreationDateAndTime : longint;
NewOwnerObjectID : LongInt;
NewMaximumRightsMask : byte) : byte;
var
r : registers;
SendPacket : array[0..270] of byte;
ReplyPacket : array[0..2] of byte;
WordPtr : ^word;
begin
SendPacket[2] := 25;
SendPacket[3] := DirectoryHandle;
move(NewCreationDateAndTime,SendPacket[4],4);
NewOwnerObjectID := GetLong(addr(NewOwnerObjectID));
move(NewOwnerObjectID,SendPacket[8],4);
SendPacket[12] := newMaximumRightsMask;
SendPacket[13] := Length(DirectoryPath);
move(DirectoryPath[1],SendPacket[14],Length(DirectoryPath));
WordPtr := addr(SendPacket);
WordPtr^ := Length(DirectoryPath)+12;
WordPtr := addr(ReplyPacket);
WordPtr^ := 0;
r.BX := r.DS;
r.AH := $0E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
SetDirectoryInformation := r.AL;
end;
Function GetDirectoryPath(DirectoryHandle : byte;
Var directoryPath : string) : byte;
var
r : registers;
SendPacket : array[0..4] of byte;
ReplyPacket : array[0..258] of byte;
WordPtr : ^word;
begin
SendPacket[2] := 1;
SendPacket[3] := DirectoryHandle;
WordPtr := addr(SendPacket);
WordPtr^ := 2;
WordPtr := addr(ReplyPacket);
WordPtr^ := 256;
r.BX := r.DS;
r.AH := $0E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
GetDirectoryPath := r.AL;
if r.AL = 0 then
begin
move(ReplyPacket[3],DirectoryPath[1],ReplyPacket[2]);
move(ReplyPacket[2],DirectoryPath[0],1);
end;
end;
Function GetVolumeNumber(VolumeName : string;
Var VolumeNumber : integer) : byte;
var
r : registers;
SendPacket : array[0..19] of byte;
ReplyPacket : array[0..3] of byte;
WordPtr : ^word;
begin
SendPacket[2] := 5;
SendPacket[3] := Length(VolumeName);
move(VolumeName[1],SendPacket[4],Length(VolumeName));
WordPtr := addr(SendPacket);
WordPtr^ := Length(VolumeName)+2;
WordPtr := addr(ReplyPacket);
WordPtr^ := 1;
r.BX := r.DS;
r.AH := $0E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
GetVolumeNumber := r.AL;
if r.AL = 0 then
VolumeNumber := ReplyPacket[2];
end;
Function GetVolumeName(VolumeNumber : integer;
Var VolumeName : string) : byte;
var
r : registers;
SendPacket : array[0..4] of byte;
ReplyPacket : array[0..18] of byte;
WordPtr : ^word;
begin
SendPacket[2] := 6;
SendPacket[3] := VolumeNumber;
WordPtr := addr(SendPacket);
WordPtr^ := 2;
WordPtr := addr(ReplyPacket);
WordPtr^ := 18;
r.BX := r.DS;
r.AH := $0E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
GetVolumeName := r.AL;
if r.AL = 0 then
begin
move(ReplyPacket[3],VolumeName[1],ReplyPacket[2]);
move(ReplyPacket[2],VolumeName[0],1);
end;
end;
Function PurgeErasedFiles : byte;
var
r : registers;
SendPacket : array[0..2] of byte;
ReplyPacket : array[0..1] of byte;
WordPtr : ^word;
begin
SendPacket[2] := $10;
WordPtr := addr(SendPacket);
WordPtr^ := 1;
WordPtr := addr(ReplyPacket);
WordPtr^ := 0;
r.BX := r.DS;
r.AH := $0E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
PurgeErasedFiles := r.AL;
end;
Function RestoreErasedFile(DriveHandle : byte;
VolumeName : string;
Var ErasedFileName ,
RestoredFileName : string) : byte;
var
r : registers;
SendPacket : array[0..21] of byte;
ReplyPacket : array[0..32] of byte;
WordPtr : ^word;
begin
SendPacket[2] := $11;
SendPacket[3] := DriveHandle;
SendPacket[4] := Length(VolumeName);
move(VolumeName[1],SendPacket[5],Length(VolumeName));
WordPtr := addr(SendPacket);
WordPtr^ := Length(VolumeName)+3;
WordPtr := addr(ReplyPacket);
WordPtr^ := 30;
r.BX := r.DS;
r.AH := 226;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
RestoreErasedFile := r.AL;
if r.AL = 0 then
begin
move(ReplyPacket[2],ErasedFileName[1],15);
ErasedFileName[0] := chr(15);
move(ReplyPacket[17],RestoredFileName[1],15);
RestoredFileName[0] := chr(15);
end;
end;
Function GetDirectoryHandle(Drive : byte;
Var Handle : byte) : byte;
var r : registers;
begin
r.AH := $E9;
r.AL := 0;
r.DH := 0;
r.DL := Drive;
intr($21,r);
Handle := r.AL;
GetDirectoryHandle := r.AH;
end;
Function SaveDirectoryHandle(DirectoryHandle : byte;
Var SaveBuffer : String) : byte;
var
r : registers;
SendPacket : array[0..4] of byte;
ReplyPacket : array[0..16] of byte;
WordPtr : ^word;
begin
SendPacket[2] := 23;
SendPacket[3] := DirectoryHandle;
WordPtr := addr(SendPacket);
WordPtr^ := 2;
WordPtr := addr(ReplyPacket);
WordPtr^ := 14;
r.BX := r.DS;
r.AH := 226;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
SaveDirectoryHandle := r.AL;
if r.AL = 0 then
begin
move(ReplyPacket[2],SaveBuffer,14);
end;
end;
Function RestoreDirectoryHandle(SaveBuffer : string;
Var newDirectoryHandle : byte;
Var EffectiveRigthMask : Byte) : byte;
var
r : registers;
SendPacket : array[0..19] of byte;
ReplyPacket : array[0..4] of byte;
WordPtr : ^word;
begin
SendPacket[2] := 24;
SendPacket[3] := Length(SaveBuffer);
move(SaveBuffer[1],SendPacket[4],Length(SaveBuffer));
WordPtr := addr(SendPacket);
WordPtr^ := 17;
WordPtr := addr(ReplyPacket);
WordPtr^ := 2;
r.BX := r.DS;
r.AH := 226;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
RestoreDirectoryHandle := r.AL;
if r.AL = 0 then
begin
NewDirectoryHandle := ReplyPacket[2];
EffectiveRigthMask := ReplyPacket[3];
end;
end;
Function SetFileInformation( driveHandle : byte;
filePath : string;
searchAttributes : byte;
fileAttributes : byte;
extendedFileAttributes : byte;
creationDate : integer;
lastAccessDate : integer;
lastUpdateDateAndTime : LongInt;
lastArchiveDateAndTime : LongInt;
fileOwnerID : LongInt) : byte;
var
r : registers;
SendPacket : array[0..339] of byte;
ReplyPacket : array[0..2] of byte;
WordPtr : ^word;
i : integer;
begin
SendPacket[2] := 16;
SendPacket[3] := FileAttributes;
SendPacket[4] := ExtendedFileAttributes;
SendPacket[5] := 0;
SendPacket[6] := 0;
SendPacket[7] := 0;
SendPacket[8] := 0;
move(CreationDate,SendPacket[9],2);
move(LastAccessDate,SendPacket[11],2);
move(LastUpdateDateAndTime,SendPacket[13],4);
FileOwnerID := GetLong(addr(FileOwnerID));
move(FileOwnerID,SendPacket[17],4);
move(lastArchiveDateAndTime,SendPacket[21],4);
for i := 25 to 80 do
SendPacket[i] := 0;
SendPacket[81] := DriveHandle;
SendPacket[82] := searchAttributes;
SendPacket[83] := Length(FilePath);
move(FilePath[1],SendPacket[84],Length(FilePath));
WordPtr := addr(SendPacket);
WordPtr^ := Length(FilePath)+ 82;
WordPtr := addr(ReplyPacket);
WordPtr^ := 0;
r.BX := r.DS;
r.AH := 227;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
SetFileInformation:= r.AL;
end;
Function GetExtendedFileAttributes(FilePath : string;
Var Attr : byte) : byte;
var r : registers;
begin
FilePath[Length(FilePath)+1] := chr(0);
r.BX := r.DS;
r.AH := $B6;
r.AL := 0;
r.DS := SEG(FilePath[1]);
r.DX := OFS(FilePath[1]);
intr($21,r);
r.DS := r.BX;
Attr := r.CL;
if (r.Flags and FCARRY ) = 0 then
GetExtendedFileAttributes := 0 else
GetExtendedFileAttributes := r.AL;
end;
Function SetExtendedFileAttributes(FilePath : string;
attr : byte) : byte;
var r : registers;
begin
FilePath[Length(FilePath)+1] := chr(0);
r.BX := r.DS;
r.AH := $B6;
r.AL := $01;
r.CL := Attr;
r.DS := SEG(FilePath[1]);
r.DX := OFS(FilePath[1]);
intr($21,r);
r.DS := r.BX;
if (r.Flags and FCARRY ) = 0 then
SetExtendedFileAttributes := 0 else
SetExtendedFileAttributes := r.AL;
end;
Function AllocPermanentDirectoryHandle(DirectoryHandle:Byte;
DirectoryPath :string;
DriveLetter :char;
Var NewDirectoryHandle,
EffectiveRigthMask : byte):byte;
Var
r : registers;
SendPacket : array[0..261] of byte;
ReplyPacket : array[0..004] of byte;
WordPtr : ^Word;
begin
SendPacket[2] := $12;
SendPacket[3] := DirectoryHandle;
SendPacket[4] := Ord(DriveLetter);
move(DirectoryPath,SendPacket[5],Length(DirectoryPath)+1);
WordPtr := addr(SendPacket);
WordPtr^ := Length(DirectoryPath)+4;
WordPtr := addr(ReplyPacket);
WordPtr^ := 2;
r.BX := r.DS;
r.AH := $E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
AllocPermanentDirectoryHandle := r.AL;
if r.AL = 0 then
begin
NewDirectoryHandle := ReplyPacket[2];
EffectiveRigthMask := ReplyPacket[3];
end;
end;
Function AllocTemporaryDirectoryHandle(DirectoryHandle:Byte;
DirectoryPath :string;
DriveLetter :char;
Var NewDirectoryHandle,
EffectiveRigthMask : byte):byte;
Var
r : registers;
SendPacket : array[0..261] of byte;
ReplyPacket : array[0..004] of byte;
WordPtr : ^Word;
begin
SendPacket[2] := $13;
SendPacket[3] := DirectoryHandle;
SendPacket[4] := Ord(DriveLetter);
move(DirectoryPath,SendPacket[5],Length(DirectoryPath)+1);
WordPtr := addr(SendPacket);
WordPtr^ := Length(DirectoryPath)+4;
WordPtr := addr(ReplyPacket);
WordPtr^ := 2;
r.BX := r.DS;
r.AH := $E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
AllocTemporaryDirectoryHandle := r.AL;
if r.AL = 0 then
begin
NewDirectoryHandle := ReplyPacket[2];
EffectiveRigthMask := ReplyPacket[3];
end;
end;
Procedure DeallocateDirectoryHandle(DirectoryHandle : byte);
Var
r : registers;
SendPacket : array[0..4] of byte;
ReplyPacket : array[0..2] of byte;
WordPtr : ^Word;
begin
SendPacket[2] := $14;
SendPacket[3] := DirectoryHandle;
WordPtr := addr(SendPacket);
WordPtr^ := 2;
WordPtr := addr(ReplyPacket);
WordPtr^ := 0;
r.BX := r.DS;
r.AH := $E2;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
end;
End.
[Back to NETWORK SWAG index] [Back to Main SWAG index] [Original]