Code snippet ...
|
procedure GetNetworkedDrives( strings: TStrings);
procedure EnumNetworkDrives( pnr : PNetResource);
var
hEnum: THandle;
i, enumRes, count, BufferSize: DWORD;
buffer: pointer;
begin
BufferSize := $4000; //ie: use a 16kb buffer
buffer := nil; //just in case memory allocation fails
if WNetOpenEnum(RESOURCE_GLOBALNET,
RESOURCETYPE_DISK, 0, pnr, hEnum) = ERROR_SUCCESS then
try
GetMem(buffer, BufferSize);
while true do
begin
count := dword(-1); //ie: get as many items possible
enumRes := WNetEnumResource(hEnum,
count, buffer, BufferSize);
//break if either no more items found or an error occurs...
if (enumRes <> ERROR_SUCCESS) then break;
pnr := buffer; //reuse the pnr pointer
for i := 1 to count do
begin
if (pnr.dwDisplayType =
RESOURCEDISPLAYTYPE_DOMAIN or
RESOURCEDISPLAYTYPE_SERVER) and
(pnr.dwType = RESOURCETYPE_DISK) then
strings.Add(pnr.lpRemoteName);
//recursive function call...
if (pnr.dwUsage and RESOURCEUSAGE_CONTAINER) > 0 then
EnumNetworkDrives(pnr);
inc(longint(pnr),sizeof(TNetResource));
end;
end;
finally
FreeMem(buffer);
WNetCloseEnum(hEnum);
end;
end;
begin
if strings = nil then exit;
//simply call the nested recursive function
//passing nil to starting at the network root ...
EnumNetworkDrives(nil);
end;
|
|
|
|