
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5438 8e941d3f-bd1b-0410-a28a-d453659cc2b4
151 lines
4.5 KiB
ObjectPascal
151 lines
4.5 KiB
ObjectPascal
{*********************************************************}
|
|
{* FlashFiler: Conversion of drive:path to UNC names *}
|
|
{*********************************************************}
|
|
|
|
(* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is TurboPower FlashFiler
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* TurboPower Software
|
|
*
|
|
* Portions created by the Initial Developer are Copyright (C) 1996-2002
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*
|
|
* ***** END LICENSE BLOCK ***** *)
|
|
|
|
{$I ffdefine.inc}
|
|
|
|
unit ffllunc;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows,
|
|
Messages,
|
|
SysUtils,
|
|
ffllbase;
|
|
|
|
function FFExpandUNCFileName(const FN : TffFullFileName) : TffFullFileName;
|
|
|
|
implementation
|
|
|
|
{===Win32 Helper routines============================================}
|
|
function GetUniversalNameNT(const EFN : TffFullFileName) : TffFullFileName;
|
|
var
|
|
BufSize : DWORD;
|
|
EFNZ : TffStringZ;
|
|
Buffer : array [0..1023] of byte;
|
|
begin
|
|
FFStrPCopy(EFNZ, EFN);
|
|
BufSize := sizeof(Buffer);
|
|
if WNetGetUniversalName(EFNZ, UNIVERSAL_NAME_INFO_LEVEL,
|
|
@Buffer, BufSize) = NO_ERROR then
|
|
Result := FFStrPasLimit(PUniversalNameInfo(@Buffer).lpUniversalName,
|
|
pred(sizeof(TffFullFileName)))
|
|
else
|
|
Result := EFN;
|
|
end;
|
|
{--------}
|
|
function GetUniversalName95(const EFN : TffFullFileName;
|
|
var UNC : TffFullFileName) : boolean;
|
|
type
|
|
PNetResArray = ^TNetResArray;
|
|
TNetResArray = array [0..127] of TNetResource;
|
|
var
|
|
chLocal : AnsiChar;
|
|
hEnum : THandle;
|
|
dwResult : DWORD;
|
|
cbBuffer : DWORD;
|
|
NetResource : PNetResArray;
|
|
dwSize : DWORD;
|
|
cEntries : DWORD;
|
|
i : integer;
|
|
begin
|
|
{Note: according to Microsoft's article Q131416, the Windows 95
|
|
version of WNetGetUniversalName is broken, hence the funny
|
|
code (a pretty direct translation of MS's workaround using
|
|
length byte strings and try..finallys)}
|
|
Result := false;
|
|
// cursory validation
|
|
if (length(EFN) < 3) then
|
|
Exit;
|
|
// get the local drive letter
|
|
chLocal := UpCase(EFN[1]);
|
|
// more cursory validation
|
|
if (chLocal < 'A') or (chLocal > 'Z') or
|
|
(EFN[2] <> ':') or (EFN[3] <> '\' ) then
|
|
Exit;
|
|
{open a network enumeration}
|
|
if (WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_DISK,
|
|
0, nil, hEnum) <> NO_ERROR) then
|
|
Exit;
|
|
try
|
|
// start with a reasonable buffer size
|
|
cbBuffer := 50 * sizeof(TNetResource);
|
|
GetMem(NetResource, cbBuffer);
|
|
try
|
|
while true do begin
|
|
dwSize := cbBuffer;
|
|
cEntries := $7FFFFFFF;
|
|
dwResult := WNetEnumResource(hEnum, cEntries, NetResource, dwSize);
|
|
if (dwResult = ERROR_MORE_DATA) then begin
|
|
// the buffer was too small, enlarge
|
|
cbBuffer := dwSize;
|
|
ReallocMem(NetResource, cbBuffer);
|
|
continue;
|
|
end;
|
|
if (dwResult <> NO_ERROR) then
|
|
Exit;
|
|
// search for the specified drive letter
|
|
for i := 0 to pred(cEntries) do
|
|
with NetResource^[i] do
|
|
if (lpLocalName <> nil) and
|
|
(chLocal = UpCase(lpLocalName[0])) then begin
|
|
// match
|
|
Result := true;
|
|
// build a UNC name
|
|
UNC := FFStrPasLimit(lpRemoteName, pred(sizeof(TffFullFileName)));
|
|
FFShStrConcat(UNC, Copy(EFN, 3, 255));
|
|
Exit;
|
|
end;
|
|
end;
|
|
finally
|
|
FreeMem(NetResource, cbBuffer);
|
|
end;{try..finally}
|
|
finally
|
|
WNetCloseEnum(hEnum);
|
|
end;{try..finally}
|
|
end;
|
|
{--------}
|
|
function GetUniversalName(const EFN : TffFullFileName) : TffFullFileName;
|
|
begin
|
|
if (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then begin
|
|
if not GetUniversalName95(EFN, Result) then
|
|
Result := EFN;
|
|
end
|
|
else
|
|
Result := GetUniversalNameNT(EFN);
|
|
end;
|
|
{====================================================================}
|
|
|
|
function FFExpandUNCFileName(const FN : TffFullFileName) : TffFullFileName;
|
|
begin
|
|
Result := GetUniversalName(FFExpandFileName(FN));
|
|
end;
|
|
|
|
end.
|