#include #include #include #include #include #include #include #include #include "dfsadmin.h" UpdateApiCalls() { if ((++ApiCalls % 500) == 0) { printf("Api calls completed: %d\n", ApiCalls); DumpCurrentTime(); } } DFSSTATUS AddNewRoot( PROOT_DEF pRoot, LPWSTR NameSpace, BOOLEAN Update ) { UNICODE_STRING ServerName; UNICODE_STRING ShareName; UNICODE_STRING RootName; LPWSTR ServerNameString = NULL; LPWSTR ShareNameString = NULL; DFSSTATUS Status; LPWSTR UseRootName; PLINK_DEF pLink; UseRootName = NameSpace; if (UseRootName == NULL) { UseRootName = pRoot->RootObjectName; } RtlInitUnicodeString(&RootName, UseRootName); Status = DfsGetPathComponents(&RootName, &ServerName, &ShareName, NULL ); if (Status == ERROR_SUCCESS) { Status = DfsCreateWideString(&ServerName, &ServerNameString); } if (Status == ERROR_SUCCESS) { Status = DfsCreateWideString(&ShareName, &ShareNameString); } if (Status == ERROR_SUCCESS) { Status = NetDfsAddStdRoot( ServerNameString, ShareNameString, NULL, 0); if (Status != ERROR_SUCCESS) { printf("NetDfsAddStdRoot failed: Status 0x%x, Server %wS Share %wS\n", Status, ServerNameString, ShareNameString); } UpdateApiCalls(); } if (ServerNameString != NULL) { free(ServerNameString); } if (ShareNameString != NULL) { free(ShareNameString); } if ((Status == ERROR_SUCCESS) || ((Status == ERROR_FILE_EXISTS) && (Update == TRUE))) { for (pLink = pRoot->pLinks; pLink != NULL; pLink = NEXT_LINK_OBJECT(pLink)) { Status = AddNewLink( UseRootName, pLink, Update); if ((Status != ERROR_SUCCESS) && ((Status != ERROR_FILE_EXISTS) || (Update != TRUE))) { if (DebugOut) { fwprintf(DebugOut, L"Add link failed: Root %wS Link %wS\n", UseRootName, pLink->LinkObjectName); } break; } } } return Status; } DFSSTATUS AddNewLink( LPWSTR RootNameString, PLINK_DEF pLink, BOOLEAN Update ) { UNICODE_STRING LinkName; DFSSTATUS Status; PTARGET_DEF pTarget; Status = DfsCreateUnicodePathString(&LinkName, 0, // not unc path: no leading seperators. RootNameString, pLink->LinkObjectName); if (Status == ERROR_SUCCESS) { // Status = NetDfsAdd( LinkName.Buffer, NULL, NULL, NULL, DFS_ADD_VOLUME); UpdateApiCalls(); if ((++AddLinks % 400) == 0) { printf("Done with %d Links %d Targets %d Api calls\n", AddLinks, AddTargets, ApiCalls ); } if (Status == ERROR_SUCCESS) { for (pTarget = pLink->LinkObjectTargets; pTarget != NULL; pTarget = pTarget->NextTarget) { Status = AddNewTarget( LinkName.Buffer, pTarget, pTarget == pLink->LinkObjectTargets); if ((Status != ERROR_SUCCESS) && ((Status != ERROR_FILE_EXISTS) || (Update != TRUE))) { if (DebugOut) { fwprintf(DebugOut, L"Add target failed: Root %wS Link %wS Target %wS\n", RootNameString, pLink->LinkObjectName, pTarget->Name); } break; } } } if (Status == ERROR_SUCCESS) { Status = UpdateLinkMetaInformation(&LinkName, pLink); } DfsFreeUnicodeString(&LinkName); } //printf("Add new link status %x\n", Status); return Status; } DWORD UpdateLinkMetaInformation( PUNICODE_STRING pLinkName, PLINK_DEF pLink) { UNREFERENCED_PARAMETER(pLinkName); UNREFERENCED_PARAMETER(pLink); return ERROR_SUCCESS; #if 0 DWORD Status = ERROR_SUCCESS; if (Status == ERROR_SUCCESS) { if (IsObjectCommentSet(pLink)) { DFS_INFO_100 Info100; Info100.Comment = pLink->BaseObject.Comment; Status = NetDfsSetInfo( pLinkName->Buffer, NULL, NULL, 100, (LPBYTE)&Info100); } } if (Status == ERROR_SUCCESS) { if (IsObjectStateSet(pLink)) { DFS_INFO_101 Info101; Info101.State = pLink->BaseObject.State; Status = NetDfsSetInfo( pLinkName->Buffer, NULL, NULL, 101, (LPBYTE)&Info101); } } if (Status == ERROR_SUCCESS) { if (IsObjectTimeoutSet(pLink)) { DFS_INFO_102 Info102; Info102.Timeout = pLink->BaseObject.Timeout; Status = NetDfsSetInfo( pLinkName->Buffer, NULL, NULL, 102, (LPBYTE)&Info102); } } return Status; #endif } DFSSTATUS AddNewTarget( LPWSTR LinkOrRoot, PTARGET_DEF pTarget, BOOLEAN FirstTarget) { LPWSTR ServerNameString = NULL; LPWSTR ShareNameString = NULL; DFSSTATUS Status; ULONG Flags = 0; UNICODE_STRING ServerName; UNICODE_STRING ShareName; UNICODE_STRING TargetName; if (FirstTarget) { Flags = DFS_ADD_VOLUME; } RtlInitUnicodeString(&TargetName, pTarget->Name ); Status = DfsGetFirstComponent(&TargetName, &ServerName, &ShareName ); if (Status == ERROR_SUCCESS) Status = DfsCreateWideString(&ServerName, &ServerNameString); if (Status == ERROR_SUCCESS) Status = DfsCreateWideString(&ShareName, &ShareNameString); if (Status == ERROR_SUCCESS) { Status = NetDfsAdd( LinkOrRoot, ServerNameString, ShareNameString, NULL, Flags); if ((Status != ERROR_SUCCESS) && (Status != ERROR_NOT_FOUND)) { printf("NetDfsAdd failed: Status 0x%x, Link %wS Server %wS Share %wS Flags 0x%x\n", Status, LinkOrRoot, ServerNameString, ShareNameString, Flags); } if (Status == ERROR_NOT_FOUND) { Status = NetDfsAdd( LinkOrRoot, ServerNameString, ShareNameString, NULL, DFS_ADD_VOLUME); if (Status != ERROR_SUCCESS) { printf("NetDfsAdd failed again!: Status 0x%x, Link %wS Server %wS Share %wS Flags 0x%x\n", Status, LinkOrRoot, ServerNameString, ShareNameString, Flags); } } UpdateApiCalls(); } if (DebugOut) { fwprintf(DebugOut, L"Add new target %wS %wS %wS status %x\n", LinkOrRoot, ServerNameString, ShareNameString, Status); } if (ServerNameString != NULL) { free(ServerNameString); } if (ShareNameString != NULL) { free(ShareNameString); } AddTargets++; return Status; } DeleteRoot( PROOT_DEF pRoot ) { LPWSTR ServerNameString = NULL; LPWSTR ShareNameString = NULL; DFSSTATUS Status; UNICODE_STRING ServerName; UNICODE_STRING ShareName; UNICODE_STRING RootName; RtlInitUnicodeString(&RootName, pRoot->RootObjectName); Status = DfsGetPathComponents(&RootName, &ServerName, &ShareName, NULL ); if (Status == ERROR_SUCCESS) Status = DfsCreateWideString(&ServerName, &ServerNameString); if (Status == ERROR_SUCCESS) Status = DfsCreateWideString(&ShareName, &ShareNameString); if (Status == ERROR_SUCCESS) { Status = NetDfsRemoveStdRoot( ServerNameString, ShareNameString, 0); if (Status != ERROR_SUCCESS) { printf("NetDfsremovedStdRoot failed: Status 0x%x, Server %wS Share %wS\n", Status, ServerNameString, ShareNameString); } } if (DebugOut) { fwprintf(DebugOut, L"Remove root %wS, Status %x\n", RootName.Buffer, Status); } if (ServerNameString != NULL) { free(ServerNameString); } if (ShareNameString != NULL) { free(ShareNameString); } return Status; } DeleteLink( LPWSTR RootNameString, PLINK_DEF pLink ) { UNICODE_STRING LinkName; DFSSTATUS Status; Status = DfsCreateUnicodePathString(&LinkName, FALSE, RootNameString, pLink->LinkObjectName); if (Status == ERROR_SUCCESS) { Status = NetDfsRemove( LinkName.Buffer, NULL, NULL); if (Status != ERROR_SUCCESS) { printf("NetDfsRemove Failed 0x%x, for link %wS\n", Status, LinkName.Buffer); } UpdateApiCalls(); if (DebugOut) { fwprintf(DebugOut, L"Removed Link %wS, Status %x\n", LinkName.Buffer, Status); } DfsFreeUnicodeString(&LinkName); } RemoveLinks++; return Status; } DeleteTarget( LPWSTR LinkOrRoot, PTARGET_DEF pTarget ) { LPWSTR ServerNameString = NULL; LPWSTR ShareNameString = NULL; DFSSTATUS Status = STATUS_SUCCESS; UNICODE_STRING ServerName; UNICODE_STRING ShareName; UNICODE_STRING TargetName; RtlInitUnicodeString( &TargetName, pTarget->Name); if (Status == ERROR_SUCCESS) { Status = DfsGetFirstComponent(&TargetName, &ServerName, &ShareName ); } if (Status == ERROR_SUCCESS) Status = DfsCreateWideString(&ServerName, &ServerNameString); if (Status == ERROR_SUCCESS) Status = DfsCreateWideString(&ShareName, &ShareNameString); if (Status == ERROR_SUCCESS) { Status = NetDfsRemove( LinkOrRoot, ServerNameString, ShareNameString); if (Status != ERROR_SUCCESS) { printf("NetDfsRemove Failed 0x%x, for link %wS, Server %wS Share %wS\n", Status, LinkOrRoot, ServerNameString, ShareNameString); } UpdateApiCalls(); } if (DebugOut) { fwprintf(DebugOut, L"Removed Link %wS target %wS, Status %x\n", LinkOrRoot, pTarget->Name, Status); } if (ServerNameString != NULL) { free(ServerNameString); } if (ShareNameString != NULL) { free(ShareNameString); } RemoveTargets++; return Status; } DFSSTATUS DfsCreateWideString( PUNICODE_STRING pName, LPWSTR *pString ) { DFSSTATUS Status = ERROR_SUCCESS; *pString = malloc(pName->Length + sizeof(WCHAR)); if (*pString != NULL) { RtlCopyMemory(*pString, pName->Buffer, pName->Length); (*pString)[pName->Length/sizeof(WCHAR)] = 0; } else { Status = ERROR_NOT_ENOUGH_MEMORY; } return Status; }