You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2742 lines
70 KiB
2742 lines
70 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
mprtest.cxx
|
|
|
|
Abstract:
|
|
|
|
Test routine for MPR entry Points.
|
|
|
|
Author:
|
|
|
|
Dan Lafferty (danl) 17-Dec-1991
|
|
|
|
Environment:
|
|
|
|
User Mode -Win32
|
|
|
|
Revision History:
|
|
|
|
17-Dec-1991 danl
|
|
created
|
|
--*/
|
|
|
|
#include "precomp.hxx"
|
|
extern "C" {
|
|
#include <ntmsv1_0.h>
|
|
}
|
|
#include <stdlib.h> // atoi
|
|
#include <stdio.h> // printf
|
|
#include <conio.h> // getch
|
|
#include <string.h> // strcmp
|
|
#include <tstr.h> // Unicode
|
|
|
|
#include <debugfmt.h> // FORMAT_LPTSTR
|
|
|
|
//
|
|
// Defines
|
|
//
|
|
|
|
#define ERR_BUF_SIZE 260
|
|
#define NAME_BUF_SIZE 260
|
|
|
|
//
|
|
// Local Functions
|
|
//
|
|
BOOL
|
|
ProcessArgs(
|
|
DWORD argc,
|
|
LPTSTR argv[]
|
|
);
|
|
|
|
VOID
|
|
RecursiveEnum(
|
|
DWORD RecursionLevel,
|
|
DWORD ResourceUsage,
|
|
LPNETRESOURCE EnumNetResource
|
|
);
|
|
|
|
BOOL
|
|
ConvertToUnicode(
|
|
OUT LPWSTR *UnicodeOut,
|
|
IN LPSTR AnsiIn
|
|
);
|
|
|
|
BOOL
|
|
GetStringFromFile(
|
|
LPDWORD LoopCount,
|
|
LPSTR buffer
|
|
);
|
|
|
|
BOOL
|
|
MakeArgsUnicode (
|
|
DWORD argc,
|
|
PCHAR argv[]
|
|
);
|
|
|
|
VOID
|
|
TestAddConnect2(
|
|
LPTSTR RemoteName,
|
|
LPTSTR RedirName);
|
|
|
|
VOID
|
|
TestAddConnect3(
|
|
LPTSTR RemoteName,
|
|
LPTSTR RedirName);
|
|
|
|
VOID
|
|
TestGetConnect(
|
|
LPTSTR lpDeviceName,
|
|
DWORD bufferSize);
|
|
|
|
VOID
|
|
TestGetUniversal(
|
|
LPTSTR lpDeviceName,
|
|
DWORD level,
|
|
DWORD bufferSize);
|
|
|
|
VOID
|
|
TestGetUser(
|
|
LPTSTR lpDevice,
|
|
DWORD bufferSize);
|
|
|
|
VOID
|
|
TestEnumConnect(
|
|
DWORD scope,
|
|
DWORD type);
|
|
|
|
VOID
|
|
TestEnumNet(VOID);
|
|
|
|
VOID
|
|
TestSetError(VOID);
|
|
|
|
VOID
|
|
TestMultiError(VOID);
|
|
|
|
VOID
|
|
TestDirStuff(VOID);
|
|
|
|
VOID
|
|
TestRestoreConnect(
|
|
LPTSTR lpDrive);
|
|
|
|
VOID
|
|
TestLotsOfStuff(VOID);
|
|
|
|
|
|
VOID
|
|
DisplayExtendedError(VOID);
|
|
|
|
VOID
|
|
DisplayMultiError(VOID);
|
|
|
|
|
|
VOID
|
|
DisplayResourceArray(
|
|
LPNETRESOURCE NetResource,
|
|
DWORD NumElements
|
|
);
|
|
|
|
VOID
|
|
DisplayResource(
|
|
LPNETRESOURCE NetResource
|
|
);
|
|
|
|
VOID
|
|
TestClearConnect(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
Usage(VOID);
|
|
|
|
VOID
|
|
InvalidParms(VOID);
|
|
|
|
LONG
|
|
wtol(
|
|
IN LPWSTR string
|
|
);
|
|
|
|
VOID
|
|
TestLogonNotify(
|
|
LPTSTR argv[],
|
|
DWORD argc
|
|
);
|
|
|
|
VOID
|
|
TestChangePassword(
|
|
LPTSTR argv[],
|
|
DWORD argc
|
|
);
|
|
|
|
|
|
VOID __cdecl
|
|
main (
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Allows manual testing of the MPR API.
|
|
|
|
mprtest
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
--*/
|
|
{
|
|
UCHAR i;
|
|
DWORD j;
|
|
LPTSTR *argv;
|
|
CHAR buffer[255];
|
|
LPSTR argvA[20];
|
|
DWORD argc=0;
|
|
BOOL KeepGoing;
|
|
DWORD LoopCount = 0;
|
|
|
|
do {
|
|
//
|
|
// Get input from the user
|
|
//
|
|
buffer[0] = 90-2;
|
|
|
|
if (LoopCount != 0) {
|
|
GetStringFromFile(&LoopCount, buffer);
|
|
printf("%s\n",buffer+2);
|
|
}
|
|
else {
|
|
printf("\nwaiting for instructions... \n");
|
|
cgets(buffer);
|
|
}
|
|
if (buffer[1] > 0) {
|
|
//
|
|
// put the string in argv/argc format.
|
|
//
|
|
buffer[1]+=2; // make this an end offset
|
|
argc=0;
|
|
for (i=2,j=0; i<buffer[1]; i++,j++) {
|
|
argc++;
|
|
argvA[j] = &(buffer[i]);
|
|
while ((buffer[i] != ' ') && (buffer[i] != '\0')) {
|
|
i++;
|
|
}
|
|
buffer[i] = '\0';
|
|
}
|
|
|
|
//
|
|
// Make the arguments unicode if necessary.
|
|
//
|
|
#ifdef UNICODE
|
|
|
|
if (!MakeArgsUnicode(argc, argvA)) {
|
|
return;
|
|
}
|
|
|
|
#endif
|
|
argv = (LPTSTR *)argvA;
|
|
|
|
if (STRICMP (argv[0], TEXT("Loop")) == 0) {
|
|
if (argc == 1) {
|
|
LoopCount=1;
|
|
}
|
|
else {
|
|
#ifdef UNICODE
|
|
LoopCount = wtol(argv[1]);
|
|
#else
|
|
LoopCount = atol(argv[1]);
|
|
#endif
|
|
}
|
|
KeepGoing = TRUE;
|
|
}
|
|
else if (STRICMP (argv[0], TEXT("done")) == 0) {
|
|
LoopCount=0;
|
|
KeepGoing = TRUE;
|
|
}
|
|
else {
|
|
KeepGoing = ProcessArgs(argc, argv);
|
|
}
|
|
#ifdef UNICODE
|
|
//
|
|
// Free up the unicode strings if there are any
|
|
//
|
|
for(j=0; j<argc; j++) {
|
|
LocalFree(argv[j]);
|
|
}
|
|
#endif
|
|
}
|
|
} while (KeepGoing);
|
|
|
|
return;
|
|
}
|
|
|
|
BOOL
|
|
ProcessArgs(
|
|
DWORD argc,
|
|
LPTSTR argv[]
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
--*/
|
|
{
|
|
DWORD status;
|
|
LPTSTR remoteName;
|
|
LPTSTR redirName;
|
|
DWORD i;
|
|
DWORD type;
|
|
|
|
|
|
//
|
|
// Check Arguments
|
|
//
|
|
if (*argv[0] == TEXT('\0')) {
|
|
printf("ERROR: no function was requested!\n");
|
|
Usage();
|
|
return(TRUE);
|
|
}
|
|
|
|
//
|
|
// Make the arguments unicode if necessary.
|
|
//
|
|
//**************
|
|
// AddConnect1
|
|
//**************
|
|
if (STRICMP (argv[0], TEXT("AddConnect1")) == 0) {
|
|
//
|
|
// If the connection information was passed in, use it. Otherwise,
|
|
// use the default.
|
|
//
|
|
if (argc == 3) {
|
|
remoteName = argv[2];
|
|
redirName = argv[1];
|
|
}
|
|
else {
|
|
remoteName = TEXT("\\\\popcorn\\public");
|
|
redirName = TEXT("f:");
|
|
}
|
|
|
|
//
|
|
// Add the Connection.
|
|
//
|
|
status = WNetAddConnection(
|
|
remoteName,
|
|
NULL,
|
|
redirName);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetAddConnection failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetAddConnection Success\n");
|
|
}
|
|
}
|
|
|
|
//**************
|
|
// AddConnect2
|
|
//**************
|
|
else if (STRICMP (argv[0], TEXT("AddConnect2")) == 0) {
|
|
//
|
|
// If the connection information was passed in, use it. Otherwise,
|
|
// use the default.
|
|
//
|
|
if (argc == 3) {
|
|
remoteName = argv[2];
|
|
redirName = argv[1];
|
|
}
|
|
else {
|
|
remoteName = TEXT("\\\\popcorn\\public");
|
|
redirName = TEXT("f:");
|
|
}
|
|
|
|
//
|
|
// Call the test program
|
|
//
|
|
TestAddConnect2(remoteName, redirName);
|
|
printf("Call it again without a redirected drive letter\n");
|
|
TestAddConnect2(remoteName, NULL);
|
|
}
|
|
|
|
//**************
|
|
// AddConnect3
|
|
//**************
|
|
else if (STRICMP (argv[0], TEXT("AddConnect3")) == 0) {
|
|
//
|
|
// If the connection information was passed in, use it. Otherwise,
|
|
// use the default.
|
|
//
|
|
if (argc == 3) {
|
|
remoteName = argv[2];
|
|
redirName = argv[1];
|
|
}
|
|
else {
|
|
remoteName = TEXT("\\\\popcorn\\public");
|
|
redirName = TEXT("f:");
|
|
}
|
|
|
|
//
|
|
// Call the test program
|
|
//
|
|
TestAddConnect3(remoteName, redirName);
|
|
printf("Call it again without a redirected drive letter\n");
|
|
TestAddConnect3(remoteName, NULL);
|
|
}
|
|
|
|
//**************
|
|
// CancelConnect
|
|
//**************
|
|
else if (STRICMP (argv[0], TEXT("CancelConnect")) == 0) {
|
|
BOOL rememberFlag = FALSE;
|
|
BOOL ForceFlag = FALSE;
|
|
|
|
//
|
|
// See if the redirected name was passed in.
|
|
//
|
|
if (argc >= 2) {
|
|
redirName = argv[1];
|
|
}
|
|
else {
|
|
redirName = TEXT("f:");
|
|
}
|
|
for (i=2; argc>i; i++) {
|
|
if (STRICMP (argv[i], TEXT("r")) ==0) {
|
|
rememberFlag = TRUE;
|
|
}
|
|
if (STRICMP (argv[i], TEXT("f")) ==0) {
|
|
ForceFlag = TRUE;
|
|
}
|
|
}
|
|
|
|
if (rememberFlag) {
|
|
status = WNetCancelConnection(redirName, ForceFlag);
|
|
}
|
|
else {
|
|
status = WNetCancelConnection2(redirName, 0, ForceFlag);
|
|
}
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetCancelConnection failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetCancelConnection Success\n");
|
|
}
|
|
}
|
|
|
|
//**************
|
|
// GetConnect
|
|
//**************
|
|
else if (STRICMP (argv[0], TEXT("GetConnect")) == 0) {
|
|
|
|
LPTSTR deviceName = NULL;
|
|
DWORD bufSize = NAME_BUF_SIZE;
|
|
|
|
if (argc >= 2) {
|
|
deviceName = argv[1];
|
|
}
|
|
if (argc >= 3) {
|
|
bufSize = ATOL(argv[2]);
|
|
}
|
|
|
|
TestGetConnect( deviceName, bufSize);
|
|
}
|
|
|
|
//******************
|
|
// GetUniversalName
|
|
//******************
|
|
else if (STRICMP (argv[0], TEXT("GetUniversalName")) == 0) {
|
|
|
|
LPTSTR deviceName = NULL;
|
|
DWORD bufSize = NAME_BUF_SIZE;
|
|
DWORD infoLevel = UNIVERSAL_NAME_INFO_LEVEL;
|
|
|
|
if (argc >= 2) {
|
|
deviceName = argv[1];
|
|
}
|
|
if (argc >= 3) {
|
|
infoLevel = ATOL(argv[2]);
|
|
}
|
|
if (argc >= 4) {
|
|
bufSize = ATOL(argv[3]);
|
|
}
|
|
|
|
TestGetUniversal( deviceName, infoLevel, bufSize);
|
|
}
|
|
|
|
//**************
|
|
// GetUser
|
|
//**************
|
|
else if (STRICMP (argv[0], TEXT("GetUser")) == 0) {
|
|
|
|
LPTSTR deviceName = NULL;
|
|
DWORD bufSize = NAME_BUF_SIZE;
|
|
|
|
i=1;
|
|
while (argc > (i)) {
|
|
|
|
if (STRICMP(argv[i], TEXT("bufSize=")) == 0) {
|
|
bufSize = ATOL(argv[i+1]);
|
|
i++;
|
|
}
|
|
if (STRICMP(argv[i], TEXT("device=")) == 0) {
|
|
deviceName = argv[i+1];
|
|
i++;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
TestGetUser(deviceName,bufSize);
|
|
|
|
}
|
|
|
|
//**************
|
|
// Enum
|
|
//**************
|
|
else if (STRICMP (argv[0], TEXT("EnumConnect")) == 0 ||
|
|
STRICMP (argv[0], TEXT("EnumContext")) == 0) {
|
|
|
|
DWORD scope = STRICMP (argv[0], TEXT("EnumConnect")) ?
|
|
RESOURCE_CONTEXT : RESOURCE_CONNECTED;
|
|
type = RESOURCETYPE_ANY;
|
|
|
|
for (i=1; i<argc; i++) {
|
|
if (STRICMP(argv[i], TEXT("r")) == 0) {
|
|
scope = RESOURCE_REMEMBERED;
|
|
}
|
|
else if (STRICMP(argv[i], TEXT("ANY")) == 0) {
|
|
type = RESOURCETYPE_ANY;
|
|
}
|
|
else if (STRICMP(argv[i], TEXT("DISK")) == 0) {
|
|
type = RESOURCETYPE_DISK;
|
|
}
|
|
else if (STRICMP(argv[i], TEXT("PRINT")) == 0) {
|
|
type = RESOURCETYPE_PRINT;
|
|
}
|
|
else {
|
|
printf("Bad argument\n");
|
|
Usage();
|
|
return(TRUE);
|
|
}
|
|
}
|
|
TestEnumConnect(scope, type);
|
|
|
|
}
|
|
else if (STRICMP (argv[0], TEXT("EnumNet")) == 0) {
|
|
RecursiveEnum(0, 0, NULL);
|
|
//TestEnumNet();
|
|
}
|
|
//**************
|
|
// SetLastError
|
|
//**************
|
|
else if (STRICMP (argv[0], TEXT("SetError")) == 0) {
|
|
TestSetError();
|
|
}
|
|
|
|
//*********************
|
|
// MultinetGetErrorText
|
|
//*********************
|
|
else if (STRICMP (argv[0], TEXT("MultiError")) == 0) {
|
|
TestMultiError();
|
|
}
|
|
|
|
//************************************
|
|
// GetDirectoryType & DirectoryNotify
|
|
//************************************
|
|
else if (STRICMP (argv[0], TEXT("DirApi")) == 0) {
|
|
TestDirStuff();
|
|
}
|
|
|
|
//****************
|
|
// RestoreConnect
|
|
//****************
|
|
else if (STRICMP (argv[0], TEXT("RestoreConnect")) == 0) {
|
|
|
|
if (argc == 2) {
|
|
TestRestoreConnect(argv[1]);
|
|
}
|
|
else {
|
|
TestRestoreConnect(NULL);
|
|
}
|
|
}
|
|
//****************
|
|
// ClearConnect
|
|
//****************
|
|
else if (STRICMP (argv[0], TEXT("ClearConnect")) == 0) {
|
|
|
|
TestClearConnect();
|
|
}
|
|
//****************
|
|
// LogonNotify
|
|
//****************
|
|
else if (STRICMP (argv[0], TEXT("LogonNotify")) == 0) {
|
|
|
|
TestLogonNotify(&argv[1],argc-1);
|
|
}
|
|
//****************
|
|
// LogonNotify
|
|
//****************
|
|
else if (STRICMP (argv[0], TEXT("ChangePassword")) == 0) {
|
|
|
|
TestChangePassword(&argv[1],argc-1);
|
|
}
|
|
//************************************
|
|
// ALL
|
|
//************************************
|
|
else if (STRICMP (argv[0], TEXT("all")) == 0) {
|
|
TestLotsOfStuff();
|
|
}
|
|
|
|
//****************
|
|
// InvalidParms
|
|
//****************
|
|
else if (STRICMP (argv[0], TEXT("InvalidParms")) == 0) {
|
|
InvalidParms();
|
|
}
|
|
|
|
//****************
|
|
// Exit Program
|
|
//****************
|
|
else if (STRICMP (argv[0], TEXT("Exit")) == 0) {
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
else {
|
|
printf("Bad argument\n");
|
|
Usage();
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
VOID
|
|
TestAddConnect2(
|
|
LPTSTR RemoteName,
|
|
LPTSTR RedirName)
|
|
{
|
|
LPNETRESOURCE netResource;
|
|
DWORD status;
|
|
DWORD numchars = 0;
|
|
|
|
netResource = (LPNETRESOURCE) LocalAlloc(LPTR, sizeof(NETRESOURCE));
|
|
|
|
if (netResource == NULL) {
|
|
printf("TestAddConnect2:LocalAlloc Failed %d\n",GetLastError);
|
|
return;
|
|
}
|
|
|
|
netResource->lpRemoteName = RemoteName;
|
|
netResource->lpLocalName = RedirName;
|
|
|
|
if (RedirName != NULL) {
|
|
numchars = STRLEN(RedirName);
|
|
}
|
|
|
|
if (numchars == 0) {
|
|
netResource->dwType = RESOURCETYPE_ANY;
|
|
}
|
|
else if (numchars > 2) {
|
|
netResource->dwType = RESOURCETYPE_PRINT;
|
|
}
|
|
else {
|
|
netResource->dwType = RESOURCETYPE_DISK;
|
|
}
|
|
|
|
status = WNetAddConnection2(
|
|
netResource,
|
|
NULL,
|
|
NULL,
|
|
0L);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetAddConnection2 failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetAddConnection2 Success\n");
|
|
}
|
|
LocalFree(netResource);
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestAddConnect3(
|
|
LPTSTR RemoteName,
|
|
LPTSTR RedirName)
|
|
{
|
|
LPNETRESOURCE netResource;
|
|
DWORD status;
|
|
DWORD numchars = 0;
|
|
|
|
netResource = (LPNETRESOURCE) LocalAlloc(LPTR, sizeof(NETRESOURCE));
|
|
|
|
if (netResource == NULL) {
|
|
printf("TestAddConnect3:LocalAlloc Failed %d\n",GetLastError);
|
|
return;
|
|
}
|
|
|
|
netResource->lpRemoteName = RemoteName;
|
|
netResource->lpLocalName = RedirName;
|
|
|
|
if (RedirName != NULL) {
|
|
numchars = STRLEN(RedirName);
|
|
}
|
|
|
|
if (numchars == 0) {
|
|
netResource->dwType = RESOURCETYPE_ANY;
|
|
}
|
|
else if (numchars > 2) {
|
|
netResource->dwType = RESOURCETYPE_PRINT;
|
|
}
|
|
else {
|
|
netResource->dwType = RESOURCETYPE_DISK;
|
|
}
|
|
|
|
status = WNetAddConnection3(
|
|
(HWND)0x33113322,
|
|
netResource,
|
|
NULL,
|
|
NULL,
|
|
0L);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetAddConnection3 failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetAddConnection3 Success\n");
|
|
}
|
|
LocalFree(netResource);
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestGetConnect(
|
|
LPTSTR lpDeviceName,
|
|
DWORD bufferSize)
|
|
{
|
|
LPTSTR remoteName = NULL;
|
|
DWORD status;
|
|
TCHAR defaultDevice[]=TEXT("f:");
|
|
LPTSTR lpDevice;
|
|
|
|
|
|
if (lpDeviceName == NULL) {
|
|
lpDevice = defaultDevice;
|
|
}
|
|
else {
|
|
lpDevice = lpDeviceName;
|
|
}
|
|
remoteName = (LPTSTR)LocalAlloc(LMEM_FIXED, bufferSize);
|
|
if (remoteName == NULL) {
|
|
printf("TestGetConnect: Couldn't allocate memory\n");
|
|
return;
|
|
}
|
|
|
|
//
|
|
// 1st Time
|
|
//
|
|
status = WNetGetConnection(
|
|
lpDevice,
|
|
remoteName,
|
|
&bufferSize);
|
|
|
|
if (( status != WN_SUCCESS) && (status != ERROR_CONNECTION_UNAVAIL)) {
|
|
printf("WNetGetConnection failed %d\n",status);
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
//
|
|
// If insufficient buffer, display needed size.
|
|
//
|
|
if (status == WN_MORE_DATA) {
|
|
printf("Insufficient buffer size. Need %d bytes\n",bufferSize);
|
|
}
|
|
}
|
|
else {
|
|
if (status == ERROR_CONNECTION_UNAVAIL) {
|
|
printf("Not Currently Connected, but it is remembered\n");
|
|
}
|
|
else {
|
|
printf("WNetGetConnection Success\n");
|
|
}
|
|
printf(""FORMAT_LPTSTR" is connected to "FORMAT_LPTSTR"\n",lpDevice,remoteName);
|
|
}
|
|
|
|
//
|
|
// 2nd Time
|
|
//
|
|
if (remoteName != NULL) {
|
|
LocalFree(remoteName);
|
|
}
|
|
printf("Allocating a new buffer of %d bytes\n",bufferSize);
|
|
remoteName = (LPTSTR)LocalAlloc(LMEM_FIXED, bufferSize);
|
|
if (remoteName == NULL) {
|
|
printf("TestGetConnect: Couldn't allocate memory(2nd time)\n");
|
|
return;
|
|
}
|
|
|
|
status = WNetGetConnection(
|
|
lpDevice,
|
|
remoteName,
|
|
&bufferSize);
|
|
|
|
if (( status != WN_SUCCESS) && (status != ERROR_CONNECTION_UNAVAIL)) {
|
|
printf("WNetGetConnection failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
//
|
|
// If insufficient buffer, display needed size.
|
|
//
|
|
if (status == WN_MORE_DATA) {
|
|
printf("Insufficient buffer size. Need %d bytes\n",bufferSize);
|
|
}
|
|
}
|
|
else {
|
|
if (status == ERROR_CONNECTION_UNAVAIL) {
|
|
printf("Not Currently Connected, but it is remembered\n");
|
|
}
|
|
else {
|
|
printf("WNetGetConnection Success\n");
|
|
}
|
|
printf(""FORMAT_LPTSTR" is connected to "FORMAT_LPTSTR"\n",lpDevice,remoteName);
|
|
}
|
|
if (remoteName != NULL) {
|
|
LocalFree(remoteName);
|
|
}
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestGetUniversal(
|
|
LPTSTR lpDeviceName,
|
|
DWORD level,
|
|
DWORD bufferSize)
|
|
{
|
|
LPBYTE buffer = NULL;
|
|
DWORD status;
|
|
TCHAR defaultDevice[]=TEXT("");
|
|
LPTSTR lpDevice;
|
|
LPTSTR pNothing = TEXT("<nothing>");
|
|
|
|
LPUNIVERSAL_NAME_INFO pUniversalInfo = NULL;
|
|
LPREMOTE_NAME_INFO pRemoteInfo = NULL;
|
|
|
|
|
|
if (lpDeviceName == NULL) {
|
|
lpDevice = defaultDevice;
|
|
}
|
|
else {
|
|
lpDevice = lpDeviceName;
|
|
}
|
|
|
|
buffer = (LPBYTE)LocalAlloc(LMEM_FIXED, bufferSize);
|
|
if (buffer == NULL) {
|
|
printf("TestGetConnect: Couldn't allocate memory\n");
|
|
return;
|
|
}
|
|
|
|
//----------------
|
|
// 1st Time
|
|
//----------------
|
|
status = WNetGetUniversalName(
|
|
lpDevice,
|
|
level,
|
|
buffer,
|
|
&bufferSize);
|
|
|
|
if (( status != WN_SUCCESS) && (status != ERROR_CONNECTION_UNAVAIL)) {
|
|
printf("WNetGetUniversalName failed %d\n",status);
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
//
|
|
// If insufficient buffer, display needed size.
|
|
//
|
|
if (status == WN_MORE_DATA) {
|
|
printf("Insufficient buffer size. Need %d bytes\n",bufferSize);
|
|
}
|
|
}
|
|
else {
|
|
if (status == ERROR_CONNECTION_UNAVAIL) {
|
|
printf("Not Currently Connected, but it is remembered\n");
|
|
}
|
|
else {
|
|
printf("WNetGetUniversalName Success\n");
|
|
}
|
|
switch (level) {
|
|
case UNIVERSAL_NAME_INFO_LEVEL:
|
|
|
|
pUniversalInfo = (LPUNIVERSAL_NAME_INFO)buffer;
|
|
printf(""FORMAT_LPTSTR" is connected to "FORMAT_LPTSTR"\n",
|
|
lpDevice,pUniversalInfo->lpUniversalName);
|
|
|
|
break;
|
|
case REMOTE_NAME_INFO_LEVEL:
|
|
|
|
pRemoteInfo = (LPREMOTE_NAME_INFO)buffer;
|
|
|
|
if (pRemoteInfo->lpUniversalName == NULL) {
|
|
pRemoteInfo->lpUniversalName = pNothing;
|
|
}
|
|
|
|
printf(""FORMAT_LPTSTR" is connected to: \n"
|
|
" UniversalName = "FORMAT_LPTSTR"\n"
|
|
" ConnectionName = "FORMAT_LPTSTR"\n"
|
|
" RemainingPath = "FORMAT_LPTSTR"\n\n",
|
|
lpDevice,
|
|
pRemoteInfo->lpUniversalName,
|
|
pRemoteInfo->lpConnectionName,
|
|
pRemoteInfo->lpRemainingPath);
|
|
|
|
break;
|
|
|
|
default:
|
|
printf("PROBLEM: Invalid Level didn't produce an error\n");
|
|
}
|
|
}
|
|
|
|
//---------------
|
|
// 2nd Time
|
|
//---------------
|
|
if (buffer != NULL) {
|
|
LocalFree(buffer);
|
|
}
|
|
printf("Allocating a new buffer of %d bytes\n",bufferSize);
|
|
buffer = (LPBYTE)LocalAlloc(LMEM_FIXED, bufferSize);
|
|
if (buffer == NULL) {
|
|
printf("TestGetConnect: Couldn't allocate memory(2nd time)\n");
|
|
return;
|
|
}
|
|
|
|
status = WNetGetUniversalName(
|
|
lpDevice,
|
|
level,
|
|
buffer,
|
|
&bufferSize);
|
|
|
|
if (( status != WN_SUCCESS) && (status != ERROR_CONNECTION_UNAVAIL)) {
|
|
printf("WNetGetUniversalName failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
//
|
|
// If insufficient buffer, display needed size.
|
|
//
|
|
if (status == WN_MORE_DATA) {
|
|
printf("Insufficient buffer size. Need %d bytes\n",bufferSize);
|
|
}
|
|
}
|
|
else {
|
|
if (status == ERROR_CONNECTION_UNAVAIL) {
|
|
printf("Not Currently Connected, but it is remembered\n");
|
|
}
|
|
else {
|
|
printf("WNetGetUniversalName Success\n");
|
|
}
|
|
switch (level) {
|
|
case UNIVERSAL_NAME_INFO_LEVEL:
|
|
|
|
pUniversalInfo = (LPUNIVERSAL_NAME_INFO)buffer;
|
|
printf(""FORMAT_LPTSTR" is connected to "FORMAT_LPTSTR"\n",
|
|
lpDevice,pUniversalInfo->lpUniversalName);
|
|
|
|
break;
|
|
case REMOTE_NAME_INFO_LEVEL:
|
|
|
|
pRemoteInfo = (LPREMOTE_NAME_INFO)buffer;
|
|
|
|
if (pRemoteInfo->lpUniversalName == NULL) {
|
|
pRemoteInfo->lpUniversalName = pNothing;
|
|
}
|
|
|
|
printf(""FORMAT_LPTSTR" is connected to: \n"
|
|
" UniversalName = "FORMAT_LPTSTR"\n"
|
|
" ConnectionName = "FORMAT_LPTSTR"\n"
|
|
" RemainingPath = "FORMAT_LPTSTR"\n\n",
|
|
lpDevice,
|
|
pRemoteInfo->lpUniversalName,
|
|
pRemoteInfo->lpConnectionName,
|
|
pRemoteInfo->lpRemainingPath);
|
|
|
|
break;
|
|
|
|
default:
|
|
printf("PROBLEM: Invalid Level didn't produce an error\n");
|
|
}
|
|
}
|
|
if (buffer != NULL) {
|
|
LocalFree(buffer);
|
|
}
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestGetUser(
|
|
LPTSTR lpDevice,
|
|
DWORD cBuffer)
|
|
{
|
|
DWORD status;
|
|
LPTSTR userName = NULL;
|
|
DWORD saveBufSize;
|
|
|
|
userName = (LPTSTR)LocalAlloc(LMEM_FIXED, cBuffer);
|
|
if (userName == NULL) {
|
|
printf("TestGetUser: Couldn't allocate memory\n");
|
|
return;
|
|
}
|
|
saveBufSize = cBuffer;
|
|
|
|
//
|
|
// Get the currently logged on user
|
|
//
|
|
status = WNetGetUser (NULL, userName, &cBuffer);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetGetUser failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
//
|
|
// If insufficient buffer, display needed size.
|
|
//
|
|
if (status == WN_MORE_DATA) {
|
|
printf("Insufficient buffer size. Need %d bytes\n",cBuffer);
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetGetUser Success\n");
|
|
printf("CurrentUser = "FORMAT_LPTSTR"\n", userName);
|
|
}
|
|
|
|
//
|
|
// If there is a local device given, get the user for that.
|
|
//
|
|
|
|
if (lpDevice != NULL){
|
|
|
|
cBuffer = saveBufSize;
|
|
status = WNetGetUser (lpDevice, userName, &cBuffer);
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetGetUser failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
//
|
|
// If insufficient buffer, display needed size.
|
|
//
|
|
if (status == WN_MORE_DATA) {
|
|
printf("Insufficient buffer size. Need %d bytes\n",cBuffer);
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetGetUser Success\n");
|
|
printf("User for "FORMAT_LPTSTR" is "FORMAT_LPTSTR"\n", lpDevice, userName);
|
|
}
|
|
}
|
|
if (userName != NULL) {
|
|
LocalFree(userName);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestEnumConnect(
|
|
DWORD dwScope,
|
|
DWORD type)
|
|
{
|
|
DWORD status;
|
|
HANDLE enumHandle;
|
|
LPNETRESOURCE netResource;
|
|
DWORD numElements;
|
|
DWORD bufferSize;
|
|
|
|
//
|
|
// Attempt to allow for 10 connections
|
|
//
|
|
bufferSize = (10*sizeof(NETRESOURCE))+1024;
|
|
|
|
netResource = (LPNETRESOURCE) LocalAlloc(LPTR, bufferSize);
|
|
|
|
if (netResource == NULL) {
|
|
printf("TestEnum:LocalAlloc Failed %d\n",GetLastError);
|
|
return;
|
|
}
|
|
|
|
//-----------------------------------
|
|
// Get a handle for a top level enum
|
|
//-----------------------------------
|
|
status = WNetOpenEnum(
|
|
dwScope,
|
|
type,
|
|
0,
|
|
NULL,
|
|
&enumHandle);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetOpenEnum failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
goto CleanExit;
|
|
}
|
|
else {
|
|
printf("WNetOpenEnum Success\n");
|
|
}
|
|
|
|
//-----------------------------------
|
|
// Enumerate the resources
|
|
//-----------------------------------
|
|
do
|
|
{
|
|
numElements = 0xffffffff;
|
|
|
|
status = WNetEnumResource(
|
|
enumHandle,
|
|
&numElements,
|
|
netResource,
|
|
&bufferSize);
|
|
|
|
if ( status == WN_SUCCESS )
|
|
{
|
|
CHAR response;
|
|
|
|
printf("WNetEnumResource Success - resources follow\n");
|
|
DisplayResourceArray(netResource, numElements);
|
|
|
|
printf("Get more resources? ");
|
|
response = getch();
|
|
response = toupper(response);
|
|
if (response == 'N')
|
|
{
|
|
break;
|
|
}
|
|
printf("\r");
|
|
}
|
|
else if ( status == WN_NO_MORE_ENTRIES)
|
|
{
|
|
printf("WNetEnumResource Success - no more resources to display\n");
|
|
}
|
|
else
|
|
{
|
|
printf("WNetEnumResource failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR)
|
|
{
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
} while ( status == WN_SUCCESS );
|
|
|
|
//------------------------------------------
|
|
// Close the EnumHandle & print the results
|
|
//------------------------------------------
|
|
status = WNetCloseEnum(enumHandle);
|
|
if (status != WN_SUCCESS) {
|
|
printf("WNetCloseEnum failed %d\n",status);
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
goto CleanExit;
|
|
|
|
}
|
|
|
|
|
|
CleanExit:
|
|
LocalFree(netResource);
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestEnumNet(VOID)
|
|
{
|
|
DWORD status;
|
|
HANDLE enumHandle;
|
|
LPNETRESOURCE netResource;
|
|
DWORD numElements;
|
|
DWORD bufferSize;
|
|
DWORD saveBufSize;
|
|
DWORD i;
|
|
DWORD numProviders=5;
|
|
HANDLE providerArray[5];
|
|
|
|
//
|
|
// Attempt to allow for 10 resource structures
|
|
//
|
|
saveBufSize = bufferSize = (10*sizeof(NETRESOURCE))+1024;
|
|
|
|
netResource = (LPNETRESOURCE) LocalAlloc(LPTR, bufferSize);
|
|
|
|
if (netResource == NULL) {
|
|
printf("TestEnum:LocalAlloc Failed %d\n",GetLastError);
|
|
return;
|
|
}
|
|
|
|
//-----------------------------------
|
|
// Get a handle for a top level enum
|
|
//-----------------------------------
|
|
status = WNetOpenEnum(
|
|
RESOURCE_GLOBALNET,
|
|
RESOURCETYPE_ANY,
|
|
0,
|
|
NULL,
|
|
&enumHandle);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetOpenEnum failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
goto CleanExit;
|
|
}
|
|
else {
|
|
printf("WNetOpenEnum Success!\n");
|
|
}
|
|
|
|
//-----------------------------------
|
|
// Enumerate the top level
|
|
//-----------------------------------
|
|
|
|
numElements = 0xffffffff;
|
|
|
|
printf("\n*------------- TOP LEVEL ENUM ------------*\n");
|
|
status = WNetEnumResource(
|
|
enumHandle,
|
|
&numElements,
|
|
netResource,
|
|
&bufferSize);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetEnumResource failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
WNetCloseEnum(enumHandle);
|
|
goto CleanExit;
|
|
}
|
|
else {
|
|
//
|
|
// Success! Display the returned array
|
|
// and close the top-level handle.
|
|
//
|
|
printf("WNetEnumResource Success\n");
|
|
DisplayResourceArray(netResource, numElements);
|
|
WNetCloseEnum(enumHandle);
|
|
}
|
|
|
|
//-------------------------------------------
|
|
// Open a handle to the next level container
|
|
// *** DOMAINS ***
|
|
//-------------------------------------------
|
|
if (numElements < numProviders) {
|
|
numProviders = numElements;
|
|
}
|
|
for (i=0; i<numProviders; i++ ) {
|
|
|
|
|
|
status = WNetOpenEnum(
|
|
RESOURCE_GLOBALNET,
|
|
RESOURCETYPE_ANY,
|
|
RESOURCEUSAGE_CONTAINER,
|
|
netResource,
|
|
&enumHandle);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetOpenEnum 2 failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
goto CleanExit;
|
|
}
|
|
else {
|
|
printf("WNetOpenEnum 2 Success\n");
|
|
providerArray[i]= enumHandle;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------
|
|
// Enumerate the next level
|
|
// *** DOMAINS ***
|
|
//
|
|
// providerArray contains handles for
|
|
// all the providers.
|
|
//
|
|
//-----------------------------------------------------------------
|
|
printf("\n*------------- 2nd LEVEL ENUM (Domains) ------------*\n");
|
|
|
|
|
|
for (i=0; i<numProviders; i++) {
|
|
|
|
numElements = 0xffffffff;
|
|
|
|
bufferSize = saveBufSize;
|
|
status = WNetEnumResource(
|
|
providerArray[i],
|
|
&numElements,
|
|
netResource,
|
|
&bufferSize);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetEnumResource 2 failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
for (i=0; i<numProviders; i++ ) {
|
|
WNetCloseEnum(providerArray[i]);
|
|
}
|
|
goto CleanExit;
|
|
}
|
|
else {
|
|
//
|
|
// Success! Display the returned array
|
|
// and close the handle.
|
|
//
|
|
printf("*** WNetEnumResource 2 Success for provider %D ***\n",i);
|
|
DisplayResourceArray(netResource, numElements);
|
|
WNetCloseEnum(providerArray[i]);
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------
|
|
// Open a handle to the next level container
|
|
// *** SERVERS ***
|
|
//-------------------------------------------
|
|
|
|
status = WNetOpenEnum(
|
|
RESOURCE_GLOBALNET,
|
|
RESOURCETYPE_ANY,
|
|
RESOURCEUSAGE_CONTAINER,
|
|
netResource,
|
|
&enumHandle);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetOpenEnum 3 failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
goto CleanExit;
|
|
}
|
|
else {
|
|
printf("WNetOpenEnum 3 Success\n");
|
|
}
|
|
|
|
//-----------------------------------
|
|
// Enumerate the next level
|
|
// *** SERVERS ***
|
|
//-----------------------------------
|
|
numElements = 0xffffffff;
|
|
|
|
printf("\n*------------- 3rd LEVEL ENUM (Servers) ------------*\n");
|
|
status = WNetEnumResource(
|
|
enumHandle,
|
|
&numElements,
|
|
netResource,
|
|
&bufferSize);
|
|
|
|
if ( status == WN_NO_MORE_ENTRIES) {
|
|
//
|
|
// Success! Display the returned array
|
|
// and close the handle.
|
|
//
|
|
printf("WNetEnumResource 3 Success - no more data to display\n");
|
|
}
|
|
else if (status == WN_SUCCESS) {
|
|
if (numElements != 0) {
|
|
printf("WNetEnumResource 3 Success - but MORE DATA\n");
|
|
DisplayResourceArray(netResource, numElements);
|
|
}
|
|
else
|
|
{
|
|
printf("WNetEnumResource 3 Success, and MORE DATA indicated --"
|
|
" but no data returned??\n");
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetEnumResource 3 failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
|
|
WNetCloseEnum(enumHandle);
|
|
|
|
CleanExit:
|
|
LocalFree(netResource);
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestSetError(VOID)
|
|
{
|
|
|
|
//
|
|
// Store and Get the 1st Error
|
|
//
|
|
printf("Setting Error WN_BAD_NETNAME. Code = %d\n", WN_BAD_NETNAME);
|
|
WNetSetLastError( WN_BAD_NETNAME, TEXT("WN_BAD_NETNAME"), TEXT("Dan's Provider"));
|
|
DisplayExtendedError();
|
|
|
|
//
|
|
// Store and Get the 2nd Error
|
|
//
|
|
printf("Setting Error WN_NO_NETWORK. Code = %d\n", WN_NO_NETWORK);
|
|
WNetSetLastError( WN_NO_NETWORK, TEXT("WN_NO_NETWORK"), TEXT("Dan's Provider"));
|
|
DisplayExtendedError();
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestMultiError(VOID)
|
|
{
|
|
|
|
//
|
|
// Store and Get the 1st Error
|
|
//
|
|
printf("Setting Error WN_BAD_NETNAME. Code = %d\n", WN_BAD_NETNAME);
|
|
WNetSetLastError( WN_BAD_NETNAME, TEXT("WN_BAD_NETNAME"), TEXT("Dan's Provider"));
|
|
DisplayMultiError();
|
|
|
|
//
|
|
// Store and Get the 2nd Error
|
|
//
|
|
printf("Setting Error WN_NO_NETWORK. Code = %d\n", WN_NO_NETWORK);
|
|
WNetSetLastError( WN_NO_NETWORK, TEXT("WN_NO_NETWORK"), TEXT("Dan's Provider"));
|
|
DisplayMultiError();
|
|
|
|
//
|
|
// Store and Get a non-WNet Error, with no text or provider
|
|
//
|
|
printf("Setting Error ERROR_SHARING_VIOLATION, no text or provider. Code = %d\n", ERROR_SHARING_VIOLATION);
|
|
WNetSetLastError( ERROR_SHARING_VIOLATION, NULL, NULL);
|
|
DisplayMultiError();
|
|
|
|
//
|
|
// Store and Get an unknown Error, with no text
|
|
//
|
|
printf("Setting arbitrary error with no text. Code = %d\n", 654321);
|
|
WNetSetLastError( 654321, NULL, TEXT("Dan's Provider"));
|
|
DisplayMultiError();
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestDirStuff(VOID)
|
|
{
|
|
DWORD status;
|
|
INT type;
|
|
|
|
//
|
|
// Test GetDirectoryType
|
|
//
|
|
status = WNetGetDirectoryType((LPTSTR)TEXT("f:\\"), (LPINT)&type, TRUE);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetGetDirectoryType failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
else {
|
|
//
|
|
// Success!
|
|
//
|
|
printf("WNetGetDirctoryType Success type = %d \n",type);
|
|
}
|
|
|
|
|
|
//
|
|
// Test DirectoryNotify
|
|
//
|
|
status = WNetDirectoryNotify(0,TEXT("f:\\"), 2);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetDirectoryNotify failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
else {
|
|
//
|
|
// Success!
|
|
//
|
|
printf("WNetDirectoryNotify Success \n");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestRestoreConnect(
|
|
LPTSTR lpDrive
|
|
)
|
|
{
|
|
DWORD status;
|
|
|
|
#ifdef UNICODE
|
|
status = WNetRestoreConnection(
|
|
(HWND)0,
|
|
lpDrive);
|
|
#else
|
|
status = RestoreConnectionA0 (
|
|
(HWND)0,
|
|
lpDrive);
|
|
#endif
|
|
|
|
if (status == NO_ERROR) {
|
|
printf("WNetRestoreConnection success\n");
|
|
}
|
|
else {
|
|
printf("WNetRestoreConnection failure %d\n",status);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
TestClearConnect(
|
|
VOID
|
|
)
|
|
{
|
|
DWORD status;
|
|
|
|
|
|
status = WNetClearConnections(
|
|
(HWND)0);
|
|
|
|
if (status == NO_ERROR) {
|
|
printf("WNetClearConnection success\n");
|
|
}
|
|
else {
|
|
printf("WNetClearConnection failure %d\n",status);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
TestLotsOfStuff(VOID)
|
|
{
|
|
DWORD status;
|
|
BOOL KeepGoing=TRUE;
|
|
|
|
do {
|
|
|
|
|
|
printf("\n*** RUNNING TestAddConnect2 for g:\n");
|
|
TestAddConnect2(TEXT("\\\\popcorn\\public"), TEXT("g:"));
|
|
printf("\n*** RUNNING TestAddConnect2 for t:\n");
|
|
TestAddConnect2(TEXT("\\\\products3\\release"), TEXT("t:"));
|
|
printf("\n*** RUNNING TestAddConnect2 for k:\n");
|
|
TestAddConnect2(TEXT("\\\\kernel\\razzle2"), TEXT("k:"));
|
|
|
|
printf("\n*** TESTING AddConnect1 for NP2 on z:\n");
|
|
status = WNetAddConnection(TEXT("!Rastaman"),NULL,TEXT("z:"));
|
|
if (status != WN_SUCCESS) {
|
|
printf("AddConnect1 for NP2 failed %d"
|
|
"- Do we have a 2nd provider?\n",status);
|
|
}
|
|
else {
|
|
printf("AddConnect1 success\n");
|
|
}
|
|
|
|
printf("\n*** RUNNING TestGetConnect\n");
|
|
TestGetConnect(TEXT("g:"),NAME_BUF_SIZE);
|
|
printf("\n*** RUNNING TestSetError\n");
|
|
TestSetError();
|
|
printf("\n*** RUNNING TestMultiError\n");
|
|
TestMultiError();
|
|
printf("\n*** RUNNING TestGetUser\n");
|
|
TestGetUser(NULL,NAME_BUF_SIZE);
|
|
printf("\n*** RUNNING TestEnumConnect (non-remembered)\n");
|
|
TestEnumConnect(RESOURCE_CONNECTED,RESOURCETYPE_DISK);
|
|
|
|
printf("\n*** RUNNING TestEnumConnect (remembered)\n");
|
|
TestEnumConnect(RESOURCE_REMEMBERED,RESOURCETYPE_DISK);
|
|
|
|
printf("\n*** RUNNING TestEnumConnect (context)\n");
|
|
TestEnumConnect(RESOURCE_CONTEXT,RESOURCETYPE_DISK);
|
|
|
|
|
|
printf("\n*** ATTEMPT to Cancel connection to t:\n");
|
|
status = WNetCancelConnection(TEXT("t:"),FALSE);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetCancelConnection failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetCancelConnection Success\n");
|
|
}
|
|
|
|
printf("\n*** ATTEMPT to Cancel connection to g:\n");
|
|
WNetCancelConnection(TEXT("g:"),FALSE);
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetCancelConnection failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetCancelConnection Success\n");
|
|
}
|
|
|
|
printf("\n*** ATTEMPT to Cancel connection to k:\n");
|
|
WNetCancelConnection(TEXT("k:"),FALSE);
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetCancelConnection failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetCancelConnection Success\n");
|
|
}
|
|
|
|
printf("\n*** ATTEMPT to Cancel connection to z:\n");
|
|
WNetCancelConnection(TEXT("z:"),TRUE);
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetCancelConnection failed %d\n",status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetCancelConnection Success\n");
|
|
}
|
|
|
|
printf("\n*** RUNNING TestEnumNet\n");
|
|
TestEnumNet();
|
|
|
|
printf(" - Do it again? (type 'n' to stop)\n");
|
|
|
|
if (getch() == 'n') {
|
|
KeepGoing = FALSE;
|
|
}
|
|
} while (KeepGoing);
|
|
return;
|
|
|
|
}
|
|
|
|
VOID
|
|
DisplayExtendedError(VOID)
|
|
{
|
|
TCHAR errorBuf[ERR_BUF_SIZE];
|
|
TCHAR nameBuf[NAME_BUF_SIZE];
|
|
DWORD errorCode;
|
|
DWORD status;
|
|
DWORD smallErrorSize;
|
|
DWORD smallNameSize;
|
|
|
|
status = WNetGetLastError(
|
|
&errorCode,
|
|
errorBuf,
|
|
ERR_BUF_SIZE,
|
|
nameBuf,
|
|
NAME_BUF_SIZE);
|
|
|
|
if(status != WN_SUCCESS) {
|
|
printf("WNetGetLastError failed %d\n",status);
|
|
return;
|
|
}
|
|
printf("EXTENDED ERROR INFORMATION: (from GetLastError)\n");
|
|
printf(" Code: %d\n",errorCode);
|
|
printf(" Description: "FORMAT_LPTSTR"\n",errorBuf);
|
|
printf(" Provider: "FORMAT_LPTSTR"\n\n",nameBuf);
|
|
|
|
//---------------------------------------------------------
|
|
// Now try it with a buffer that's one character too small.
|
|
//---------------------------------------------------------
|
|
printf("Try it with buffer that is one char too small\n");
|
|
|
|
smallErrorSize = STRLEN(errorBuf);
|
|
smallNameSize = STRLEN(nameBuf);
|
|
status = WNetGetLastError(
|
|
&errorCode,
|
|
errorBuf,
|
|
smallErrorSize,
|
|
nameBuf,
|
|
smallNameSize);
|
|
|
|
if(status != WN_SUCCESS) {
|
|
printf("WNetGetLastError failed %d\n",status);
|
|
return;
|
|
}
|
|
printf("EXTENDED ERROR INFORMATION (truncated): (from GetLastError)\n");
|
|
printf(" Code: %d\n",errorCode);
|
|
printf(" Description: "FORMAT_LPTSTR"\n",errorBuf);
|
|
printf(" Provider: "FORMAT_LPTSTR"\n\n",nameBuf);
|
|
|
|
//---------------------------------------------------------
|
|
// Now try it with a zero length buffer.
|
|
//---------------------------------------------------------
|
|
printf("Try it with zero length buffers\n");
|
|
smallErrorSize = 0;
|
|
smallNameSize = 0;
|
|
status = WNetGetLastError(
|
|
&errorCode,
|
|
errorBuf,
|
|
smallErrorSize,
|
|
nameBuf,
|
|
smallNameSize);
|
|
|
|
if(status != WN_SUCCESS) {
|
|
printf("WNetGetLastError failed %d\n",status);
|
|
return;
|
|
}
|
|
printf("EXTENDED ERROR INFORMATION (zero length): (from GetLastError)\n");
|
|
printf(" Code: %d\n",errorCode);
|
|
printf(" Description: "FORMAT_LPTSTR"\n",errorBuf);
|
|
printf(" Provider: "FORMAT_LPTSTR"\n\n",nameBuf);
|
|
//---------------------------------------------------------
|
|
// Now try it with invalid buffer.
|
|
//---------------------------------------------------------
|
|
printf("Try it with invalid buffers\n");
|
|
smallErrorSize = 0;
|
|
smallNameSize = 0;
|
|
status = WNetGetLastError(
|
|
&errorCode,
|
|
(LPTSTR)0xffffeeee,
|
|
0,
|
|
(LPTSTR)0xffffeeee,
|
|
0);
|
|
|
|
if(status != WN_SUCCESS) {
|
|
printf("WNetGetLastError failed %d\n",status);
|
|
return;
|
|
}
|
|
printf("EXTENDED ERROR INFORMATION (NO BUFFER): (from GetLastError)\n");
|
|
printf(" Code: %d\n",errorCode);
|
|
printf(" Description: "FORMAT_LPTSTR"\n",errorBuf);
|
|
printf(" Provider: "FORMAT_LPTSTR"\n\n",nameBuf);
|
|
//---------------------------------------------------------
|
|
// Now try it with invalid buffer & lie about size.
|
|
//---------------------------------------------------------
|
|
printf("Try it with invalid buffers\n");
|
|
smallErrorSize = 0;
|
|
smallNameSize = 0;
|
|
status = WNetGetLastError(
|
|
&errorCode,
|
|
(LPTSTR)0xffffeeee,
|
|
2000,
|
|
(LPTSTR)0xffffeeee,
|
|
2000);
|
|
|
|
if(status != WN_SUCCESS) {
|
|
printf("WNetGetLastError failed %d\n",status);
|
|
return;
|
|
}
|
|
printf("EXTENDED ERROR INFORMATION (NO BUFFER): (from GetLastError)\n");
|
|
printf(" Code: %d\n",errorCode);
|
|
printf(" Description: "FORMAT_LPTSTR"\n",errorBuf);
|
|
printf(" Provider: "FORMAT_LPTSTR"\n\n",nameBuf);
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
DisplayMultiError(VOID)
|
|
{
|
|
TCHAR errorBuf[ERR_BUF_SIZE];
|
|
TCHAR nameBuf[NAME_BUF_SIZE];
|
|
DWORD status;
|
|
DWORD smallErrorSize;
|
|
DWORD smallNameSize;
|
|
DWORD ErrorSize = ERR_BUF_SIZE;
|
|
DWORD NameSize = NAME_BUF_SIZE;
|
|
|
|
status = MultinetGetErrorText(
|
|
errorBuf,
|
|
&ErrorSize,
|
|
nameBuf,
|
|
&NameSize);
|
|
|
|
if(status != WN_SUCCESS) {
|
|
printf("MultinetGetErrorText failed %d\n",status);
|
|
return;
|
|
}
|
|
printf("EXTENDED ERROR INFORMATION: (from MultinetGetErrorText)\n");
|
|
printf(" Description: "FORMAT_LPTSTR"\n",errorBuf);
|
|
printf(" Provider: "FORMAT_LPTSTR"\n\n",nameBuf);
|
|
|
|
//---------------------------------------------------------
|
|
// Now try it with a buffer that's one character too small.
|
|
//---------------------------------------------------------
|
|
printf("Try it with buffer that is one char too small\n");
|
|
|
|
smallErrorSize = STRLEN(errorBuf);
|
|
smallNameSize = STRLEN(nameBuf);
|
|
status = MultinetGetErrorText(
|
|
errorBuf,
|
|
&smallErrorSize,
|
|
nameBuf,
|
|
&smallNameSize);
|
|
|
|
if(status != WN_MORE_DATA) {
|
|
printf("MultinetGetErrorText FAILED %d\n",status);
|
|
return;
|
|
}
|
|
printf("EXTENDED ERROR INFORMATION (truncated): (from MultinetGetErrorText)\n");
|
|
printf(" Error size: %d\n", smallErrorSize);
|
|
printf(" Name size: %d\n", smallNameSize);
|
|
|
|
//---------------------------------------------------------
|
|
// Now try it with a zero length buffer.
|
|
//---------------------------------------------------------
|
|
printf("Try it with zero length buffers\n");
|
|
smallErrorSize = 0;
|
|
smallNameSize = 0;
|
|
status = MultinetGetErrorText(
|
|
errorBuf,
|
|
&smallErrorSize,
|
|
nameBuf,
|
|
&smallNameSize);
|
|
|
|
if(status != WN_MORE_DATA) {
|
|
printf("MultinetGetErrorText FAILED %d\n",status);
|
|
return;
|
|
}
|
|
printf("EXTENDED ERROR INFORMATION (zero length): (from MultinetGetErrorText)\n");
|
|
printf(" Error size: %d\n", smallErrorSize);
|
|
printf(" Name size: %d\n", smallNameSize);
|
|
//---------------------------------------------------------
|
|
// Now try it with invalid buffer.
|
|
//---------------------------------------------------------
|
|
printf("Try it with invalid buffers\n");
|
|
smallErrorSize = 0;
|
|
smallNameSize = 0;
|
|
status = MultinetGetErrorText(
|
|
(LPTSTR)0xffffeeee,
|
|
&smallErrorSize,
|
|
(LPTSTR)0xffffeeee,
|
|
0);
|
|
|
|
if(status != WN_BAD_POINTER) {
|
|
printf("MultinetGetErrorText failed %d\n",status);
|
|
return;
|
|
}
|
|
printf("Worked OK, returned WN_BAD_POINTER\n");
|
|
//---------------------------------------------------------
|
|
// Now try it with invalid buffer & lie about size.
|
|
//---------------------------------------------------------
|
|
printf("Try it with invalid buffers\n");
|
|
smallErrorSize = 2000;
|
|
smallNameSize = 2000;
|
|
status = MultinetGetErrorText(
|
|
(LPTSTR)0xffffeeee,
|
|
&smallErrorSize,
|
|
(LPTSTR)0xffffeeee,
|
|
&smallNameSize);
|
|
|
|
if(status != WN_BAD_POINTER) {
|
|
printf("MultinetGetErrorText failed %d\n",status);
|
|
return;
|
|
}
|
|
printf("Worked OK, returned WN_BAD_POINTER\n");
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
DisplayResourceArray(
|
|
LPNETRESOURCE NetResource,
|
|
DWORD NumElements
|
|
)
|
|
{
|
|
DWORD i;
|
|
|
|
for (i=0; i<NumElements ;i++ ) {
|
|
DisplayResource(&(NetResource[i]));
|
|
}
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
DisplayResource(
|
|
LPNETRESOURCE NetResource
|
|
)
|
|
{
|
|
printf( "*** RESOURCE ***\n");
|
|
printf( "Scope\t0x%x\n", NetResource->dwScope);
|
|
printf( "Type\t0x%x\n", NetResource->dwType);
|
|
printf( "Usage\t0x%x\n", NetResource->dwUsage);
|
|
|
|
printf( "LocalName\t"FORMAT_LPTSTR"\n", NetResource->lpLocalName);
|
|
printf( "RemoteName\t"FORMAT_LPTSTR"\n", NetResource->lpRemoteName);
|
|
printf( "Comment\t"FORMAT_LPTSTR"\n", NetResource->lpComment);
|
|
printf( "Provider\t"FORMAT_LPTSTR"\n\n", NetResource->lpProvider);
|
|
}
|
|
|
|
BOOL
|
|
MakeArgsUnicode (
|
|
DWORD argc,
|
|
PCHAR argv[]
|
|
)
|
|
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
Note:
|
|
|
|
|
|
--*/
|
|
{
|
|
DWORD i;
|
|
|
|
//
|
|
// ScConvertToUnicode allocates storage for each string.
|
|
// We will rely on process termination to free the memory.
|
|
//
|
|
for(i=0; i<argc; i++) {
|
|
|
|
if(!ConvertToUnicode( (LPWSTR *)&(argv[i]), argv[i])) {
|
|
printf("Couldn't convert argv[%d] to unicode\n",i);
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
BOOL
|
|
ConvertToUnicode(
|
|
OUT LPWSTR *UnicodeOut,
|
|
IN LPSTR AnsiIn
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function translates an AnsiString into a Unicode string.
|
|
A new string buffer is created by this function. If the call to
|
|
this function is successful, the caller must take responsibility for
|
|
the unicode string buffer that was allocated by this function.
|
|
The allocated buffer should be free'd with a call to LocalFree.
|
|
|
|
NOTE: This function allocates memory for the Unicode String.
|
|
|
|
Arguments:
|
|
|
|
AnsiIn - This is a pointer to an ansi string that is to be converted.
|
|
|
|
UnicodeOut - This is a pointer to a location where the pointer to the
|
|
unicode string is to be placed.
|
|
|
|
Return Value:
|
|
|
|
TRUE - The conversion was successful.
|
|
|
|
FALSE - The conversion was unsuccessful. In this case a buffer for
|
|
the unicode string was not allocated.
|
|
|
|
--*/
|
|
{
|
|
|
|
NTSTATUS ntStatus;
|
|
DWORD bufSize;
|
|
UNICODE_STRING unicodeString;
|
|
ANSI_STRING ansiString;
|
|
|
|
//
|
|
// Allocate a buffer for the unicode string.
|
|
//
|
|
|
|
bufSize = (strlen(AnsiIn)+1) * sizeof(WCHAR);
|
|
|
|
*UnicodeOut = (LPWSTR) LocalAlloc(LPTR, bufSize);
|
|
|
|
if (*UnicodeOut == NULL) {
|
|
printf("ScConvertToUnicode:LocalAlloc Failure %ld\n",GetLastError());
|
|
return(FALSE);
|
|
}
|
|
|
|
//
|
|
// Initialize the string structures
|
|
//
|
|
RtlInitAnsiString( &ansiString, AnsiIn);
|
|
|
|
unicodeString.Buffer = *UnicodeOut;
|
|
unicodeString.MaximumLength = (USHORT)bufSize;
|
|
unicodeString.Length = 0;
|
|
|
|
//
|
|
// Call the conversion function.
|
|
//
|
|
ntStatus = RtlAnsiStringToUnicodeString (
|
|
&unicodeString, // Destination
|
|
&ansiString, // Source
|
|
FALSE); // Allocate the destination
|
|
|
|
if (!NT_SUCCESS(ntStatus)) {
|
|
|
|
printf("ScConvertToUnicode:RtlAnsiStringToUnicodeString Failure %lx\n",
|
|
ntStatus);
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
//
|
|
// Fill in the pointer location with the unicode string buffer pointer.
|
|
//
|
|
*UnicodeOut = unicodeString.Buffer;
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
VOID
|
|
InvalidParms(
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Tests Invalid parameters sent to Winnet API.
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
--*/
|
|
{
|
|
DWORD status;
|
|
DWORD dwFlags;
|
|
LPNETRESOURCE netResource;
|
|
HANDLE enumHandle;
|
|
DWORD dwType;
|
|
DWORD dwScope;
|
|
DWORD dwUsage;
|
|
NETRESOURCE NetResource;
|
|
|
|
netResource = (LPNETRESOURCE) LocalAlloc(LPTR, sizeof(NETRESOURCE));
|
|
|
|
if (netResource == NULL) {
|
|
printf("InvalidParms:LocalAlloc Failed %d\n",GetLastError);
|
|
return;
|
|
}
|
|
|
|
netResource->lpRemoteName = TEXT("\\popcorn\\public");
|
|
netResource->lpLocalName = TEXT("p:");
|
|
netResource->dwType = RESOURCETYPE_DISK;
|
|
|
|
//==============================================
|
|
// WNetAddConnect2 - set dwFlags to something other than 0 or
|
|
// CONNECT_UPDATE_PROFILE.
|
|
//==============================================
|
|
dwFlags = CONNECT_UPDATE_PROFILE + 1;
|
|
status = WNetAddConnection2(netResource,NULL,NULL,dwFlags);
|
|
if (status == WN_BAD_VALUE) {
|
|
printf("InvalidParms Test #1 success\n");
|
|
}
|
|
else {
|
|
printf("InvalidParms Test #1 failed\n");
|
|
}
|
|
|
|
//==============================================
|
|
// WNetAddConnect2 - dwType = RESOURCETYPE_ANY.
|
|
// dwFlags != CONNECT_UPDATE_PROFILE.
|
|
//==============================================
|
|
|
|
netResource->dwType = RESOURCETYPE_DISK;
|
|
dwFlags = CONNECT_UPDATE_PROFILE+1;
|
|
status = WNetAddConnection2(netResource,NULL,NULL,dwFlags);
|
|
|
|
if (status == WN_BAD_VALUE) {
|
|
printf("InvalidParms Test #2 success\n");
|
|
}
|
|
else {
|
|
printf("InvalidParms Test #2 failed\n");
|
|
}
|
|
|
|
|
|
//==============================================
|
|
// WNetAddConnect2 - dwType = RESOURCETYPE_DISK.
|
|
// dwFlags = 0
|
|
//==============================================
|
|
|
|
netResource->dwType = RESOURCETYPE_DISK;
|
|
dwFlags = 0;
|
|
status = WNetAddConnection2(netResource,NULL,NULL,dwFlags);
|
|
|
|
if (status != WN_BAD_VALUE) {
|
|
printf("InvalidParms Test #3 success\n");
|
|
}
|
|
else {
|
|
printf("InvalidParms Test #3 failed\n");
|
|
}
|
|
|
|
|
|
//==============================================
|
|
// WNetAddConnect2 - lpRemoteName = NULL
|
|
//==============================================
|
|
|
|
netResource->dwType = RESOURCETYPE_DISK;
|
|
dwFlags = 0;
|
|
netResource->lpRemoteName = NULL;
|
|
status = WNetAddConnection2(netResource,NULL,NULL,dwFlags);
|
|
|
|
if (status == WN_BAD_NETNAME) {
|
|
printf("InvalidParms Test #4 success\n");
|
|
}
|
|
else {
|
|
printf("InvalidParms Test #4 failed\n");
|
|
}
|
|
|
|
|
|
//======================================================================
|
|
// WNetOpenEnum - dwScope = RESOURCE_CONNECTED | RESOURCE_GLOBALNET
|
|
//======================================================================
|
|
|
|
dwScope = RESOURCE_CONNECTED | RESOURCE_GLOBALNET | RESOURCE_REMEMBERED+1;
|
|
dwType = RESOURCETYPE_ANY;
|
|
|
|
status = WNetOpenEnum(
|
|
dwScope,
|
|
dwType,
|
|
0,
|
|
NULL,
|
|
&enumHandle);
|
|
|
|
|
|
if (status == WN_BAD_VALUE) {
|
|
printf("InvalidParms Test #5 success\n");
|
|
}
|
|
else {
|
|
printf("InvalidParms Test #5 failed\n");
|
|
}
|
|
|
|
|
|
//======================================================================
|
|
// WNetOpenEnum - dwType = RESOURCETYPE_DISK | RESOURCETYPE_PRINT |
|
|
// RESOURCETYPE_ANY + 1;
|
|
//======================================================================
|
|
|
|
dwScope = RESOURCE_CONNECTED;
|
|
dwType = (RESOURCETYPE_DISK | RESOURCETYPE_PRINT | RESOURCETYPE_ANY)+1;
|
|
|
|
status = WNetOpenEnum(
|
|
dwScope,
|
|
dwType,
|
|
0,
|
|
NULL,
|
|
&enumHandle);
|
|
|
|
|
|
if (status == WN_BAD_VALUE) {
|
|
printf("InvalidParms Test #6 success\n");
|
|
}
|
|
else {
|
|
printf("InvalidParms Test #6 failed\n");
|
|
}
|
|
|
|
|
|
//======================================================================
|
|
// WNetOpenEnum - dwUsage = RESOURCEUSAGE_CONNECTABLE |
|
|
// RESOURCEUSAGE_CONTAINER + 1
|
|
//======================================================================
|
|
|
|
dwScope = RESOURCE_GLOBALNET;
|
|
dwType = RESOURCETYPE_DISK;
|
|
dwUsage = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER) + 1;
|
|
|
|
status = WNetOpenEnum(
|
|
dwScope,
|
|
dwType,
|
|
dwUsage,
|
|
NULL,
|
|
&enumHandle);
|
|
|
|
|
|
if (status == WN_BAD_VALUE) {
|
|
printf("InvalidParms Test #7 success\n");
|
|
}
|
|
else {
|
|
printf("InvalidParms Test #7 failed\n");
|
|
}
|
|
|
|
//======================================================================
|
|
// WNetOpenEnum - NetResource Structure is filled with 0.
|
|
//======================================================================
|
|
|
|
memset(&NetResource, 0,sizeof(NetResource));
|
|
dwScope = RESOURCE_GLOBALNET;
|
|
dwType = RESOURCETYPE_ANY;
|
|
dwUsage = 0;
|
|
|
|
status = WNetOpenEnum(
|
|
dwScope,
|
|
dwType,
|
|
dwUsage,
|
|
NULL,
|
|
&enumHandle);
|
|
|
|
|
|
if (status == WN_SUCCESS) {
|
|
printf("InvalidParms Test #8 success\n");
|
|
WNetCloseEnum(enumHandle);
|
|
}
|
|
else {
|
|
printf("InvalidParms Test #8 failed\n");
|
|
}
|
|
|
|
//======================================================================
|
|
// WNetCancelConnection2 - dwFlags != CONNECT_UPDATE_PROFILE | 0.
|
|
//======================================================================
|
|
|
|
status = WNetCancelConnection2(TEXT("p:"), CONNECT_UPDATE_PROFILE + 1, FALSE);
|
|
if (status == WN_BAD_VALUE) {
|
|
printf("InvalidParms Test #9 success\n");
|
|
}
|
|
else {
|
|
printf("InvalidParms Test #9 failed\n");
|
|
}
|
|
printf("InvalidParms Test Complete\n");
|
|
|
|
LocalFree(netResource);
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
RecursiveEnum(
|
|
DWORD RecursionLevel,
|
|
DWORD ResourceUsage,
|
|
LPNETRESOURCE EnumNetResource
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
--*/
|
|
{
|
|
DWORD status;
|
|
HANDLE enumHandle;
|
|
LPNETRESOURCE netResource=NULL;
|
|
DWORD numElements;
|
|
DWORD bufferSize;
|
|
DWORD saveBufferSize;
|
|
DWORD i;
|
|
DWORD usage;
|
|
CHAR response;
|
|
|
|
//-------------------------------------------
|
|
// Open a handle to the next level container
|
|
//-------------------------------------------
|
|
|
|
status = WNetOpenEnum(
|
|
RESOURCE_GLOBALNET,
|
|
RESOURCETYPE_ANY,
|
|
ResourceUsage,
|
|
EnumNetResource,
|
|
&enumHandle);
|
|
|
|
if ( status != WN_SUCCESS) {
|
|
printf("WNetOpenEnum %d failed %d\n",RecursionLevel,status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
return;
|
|
}
|
|
else {
|
|
printf("WNetOpenEnum %d Success\n",RecursionLevel);
|
|
}
|
|
|
|
//-------------------------------------
|
|
// Allocate memory for the enumeration
|
|
//-------------------------------------
|
|
//
|
|
// Attempt to allow for 10 resource structures
|
|
//
|
|
bufferSize = (10*sizeof(NETRESOURCE))+2048;
|
|
|
|
netResource = (LPNETRESOURCE) LocalAlloc(LPTR, bufferSize);
|
|
|
|
if (netResource == NULL) {
|
|
printf("TestEnum:LocalAlloc Failed %d\n",GetLastError);
|
|
return;
|
|
}
|
|
saveBufferSize = bufferSize;
|
|
|
|
//-----------------------------------
|
|
// Enumerate the next level
|
|
//-----------------------------------
|
|
numElements = 0xffffffff;
|
|
status = WNetEnumResource(
|
|
enumHandle,
|
|
&numElements,
|
|
netResource,
|
|
&bufferSize);
|
|
|
|
if ((status == WN_NO_MORE_ENTRIES) ||
|
|
(status == WN_SUCCESS) ) {
|
|
if (numElements != 0) {
|
|
//
|
|
// Success! Display the returned array
|
|
// and close the handle.
|
|
//
|
|
if (status == WN_SUCCESS){
|
|
printf("WNetEnumResource %d Success - but MORE DATA\n",
|
|
RecursionLevel);
|
|
}
|
|
else {
|
|
printf("WNetEnumResource %d Success\n",RecursionLevel);
|
|
}
|
|
|
|
usage = RESOURCEUSAGE_CONTAINER;
|
|
|
|
switch(RecursionLevel) {
|
|
case 0:
|
|
printf("\n*------------- NETWORK PROVIDERS ------------*\n");
|
|
break;
|
|
case 1:
|
|
printf("\n*------------- DOMAINS FOR "FORMAT_LPTSTR" PROVIDER ------------*\n",
|
|
EnumNetResource->lpRemoteName);
|
|
break;
|
|
case 2:
|
|
printf("\n*------------- SERVERS ON "FORMAT_LPTSTR" DOMAIN ------------*\n",
|
|
EnumNetResource->lpRemoteName);
|
|
break;
|
|
case 3:
|
|
printf("\n*------------- SHARES ON "FORMAT_LPTSTR" SERVER ------------*\n",
|
|
EnumNetResource->lpRemoteName);
|
|
usage = RESOURCEUSAGE_CONNECTABLE;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
printf("continue? ");
|
|
response = getch();
|
|
response = toupper(response);
|
|
if (response == 'N') {
|
|
WNetCloseEnum(enumHandle);
|
|
return;
|
|
}
|
|
if (response == 'Q') {
|
|
ExitProcess(0);
|
|
}
|
|
printf("\r");
|
|
|
|
DisplayResourceArray(netResource, numElements);
|
|
for (i=0;i<numElements ;i++ ) {
|
|
RecursiveEnum(
|
|
RecursionLevel+1,
|
|
usage,
|
|
&(netResource[i]));
|
|
}
|
|
}
|
|
else {
|
|
printf("No entries to enumerate for "FORMAT_LPTSTR" rc=%d\n",
|
|
EnumNetResource->lpRemoteName,status);
|
|
}
|
|
}
|
|
else if (status == WN_MORE_DATA) {
|
|
printf("The buffer (%d bytes) was too small for one entry, need %d bytes\n",
|
|
saveBufferSize, bufferSize);
|
|
|
|
}
|
|
else {
|
|
printf("WNetEnumResource %d failed %d\n",RecursionLevel,status);
|
|
|
|
//
|
|
// If there is an extended error, display it.
|
|
//
|
|
if (status == WN_EXTENDED_ERROR) {
|
|
DisplayExtendedError();
|
|
}
|
|
}
|
|
|
|
WNetCloseEnum(enumHandle);
|
|
if (netResource != NULL) {
|
|
LocalFree(netResource);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
TestLogonNotify(
|
|
LPTSTR argv[],
|
|
DWORD argc
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
--*/
|
|
{
|
|
DWORD status;
|
|
MSV1_0_INTERACTIVE_LOGON NewLogon;
|
|
MSV1_0_INTERACTIVE_LOGON OldLogon;
|
|
LUID LogonId;
|
|
LPWSTR LogonScripts;
|
|
LPWSTR pScript;
|
|
|
|
|
|
NewLogon.MessageType = MsV1_0InteractiveLogon;
|
|
|
|
RtlInitUnicodeString(&(NewLogon.LogonDomainName),L"Domain");
|
|
RtlInitUnicodeString(&(NewLogon.UserName),L"SAMMY");
|
|
RtlInitUnicodeString(&(NewLogon.Password),L"SECRET");
|
|
|
|
OldLogon.MessageType = MsV1_0InteractiveLogon;
|
|
|
|
RtlInitUnicodeString(&(OldLogon.LogonDomainName),L"Domain");
|
|
RtlInitUnicodeString(&(OldLogon.UserName),L"SAMMY");
|
|
RtlInitUnicodeString(&(OldLogon.Password),L"NEWSECRET");
|
|
|
|
LogonId.HighPart = 5;
|
|
LogonId.LowPart = 53;
|
|
|
|
status = WNetLogonNotify(
|
|
L"Windows NT Network Provider",
|
|
&LogonId,
|
|
L"MSV1_0:Interactive",
|
|
&NewLogon,
|
|
L"MSV1_0:Interactive",
|
|
&OldLogon,
|
|
L"Dan's Station",
|
|
(LPVOID)L"POINTER",
|
|
&LogonScripts);
|
|
|
|
if (status == NO_ERROR) {
|
|
printf("WNetLogonNotify Success\n");
|
|
|
|
if (LogonScripts != NULL) {
|
|
pScript = LogonScripts;
|
|
|
|
do {
|
|
printf("LogonScripts: %ws\n",pScript);
|
|
pScript += (wcslen(pScript) + 1);
|
|
}
|
|
while (*pScript != L'\0');
|
|
|
|
LocalFree(LogonScripts);
|
|
}
|
|
}
|
|
else {
|
|
printf("WNetLogonNotify Failure %d\n",status);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
TestChangePassword(
|
|
LPTSTR argv[],
|
|
DWORD argc
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
--*/
|
|
{
|
|
DWORD status;
|
|
MSV1_0_INTERACTIVE_LOGON NewLogon;
|
|
MSV1_0_INTERACTIVE_LOGON OldLogon;
|
|
|
|
|
|
NewLogon.MessageType = MsV1_0InteractiveLogon;
|
|
|
|
RtlInitUnicodeString(&(NewLogon.LogonDomainName),L"Domain");
|
|
RtlInitUnicodeString(&(NewLogon.UserName),L"SAMMY");
|
|
RtlInitUnicodeString(&(NewLogon.Password),L"SECRET");
|
|
|
|
OldLogon.MessageType = MsV1_0InteractiveLogon;
|
|
|
|
RtlInitUnicodeString(&(OldLogon.LogonDomainName),L"Domain");
|
|
RtlInitUnicodeString(&(OldLogon.UserName),L"SAMMY");
|
|
RtlInitUnicodeString(&(OldLogon.Password),L"NEWSECRET");
|
|
|
|
status = WNetPasswordChangeNotify(
|
|
L"Windows Nt Network Provider",
|
|
L"MSV1_0:Interactive",
|
|
&NewLogon,
|
|
L"MSV1_0:Interactive",
|
|
&OldLogon,
|
|
L"Dan's Station",
|
|
(LPVOID)L"POINTER",
|
|
44);
|
|
|
|
if (status == NO_ERROR) {
|
|
printf("WNetPasswordChangeNotify Success\n");
|
|
|
|
}
|
|
else {
|
|
printf("WNetPasswordChangeNotify Failure %d\n",status);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
BOOL
|
|
GetStringFromFile(
|
|
LPDWORD lpLoopCount,
|
|
LPSTR buffer
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
The following behaviour is desired, however, I don't have time to
|
|
write it right now:
|
|
|
|
This function reads the next line of instructions from a file called
|
|
"mprtest.txt". When it reaches the end of the file, it begins again
|
|
at the beginning of the file. The first line in the file indicates how
|
|
many times to pass through the file. (Loop count). When the last pass
|
|
occurs, the instruction "done" is passed back in the buffer.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
--*/
|
|
{
|
|
if (*lpLoopCount == 0) {
|
|
strcpy(buffer+2, "done");
|
|
buffer[1]=strlen(buffer+2);
|
|
}
|
|
else {
|
|
if (*lpLoopCount & 1) {
|
|
buffer[1]=28;
|
|
strcpy(buffer+2, "AddConnect1 x: \\\\danl1\\roote");
|
|
buffer[1]=strlen(buffer+2);
|
|
}
|
|
else {
|
|
strcpy(buffer+2, "CancelConnect x: r");
|
|
buffer[1]=strlen(buffer+2);
|
|
}
|
|
(*lpLoopCount)--;
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
LONG
|
|
wtol(
|
|
IN LPWSTR string
|
|
)
|
|
{
|
|
LONG value = 0;
|
|
|
|
while((*string != L'\0') &&
|
|
(*string >= L'0') &&
|
|
( *string <= L'9')) {
|
|
value = value * 10 + (*string - L'0');
|
|
string++;
|
|
}
|
|
|
|
return(value);
|
|
}
|
|
|
|
VOID
|
|
Usage(VOID)
|
|
{
|
|
|
|
printf("USAGE:\n");
|
|
printf("<server> <function>\n");
|
|
|
|
printf("SYNTAX EXAMPLES \n");
|
|
|
|
printf("AddConnect1 <drive> <remote name> - "
|
|
"these are remembered\n");
|
|
printf("AddConnect2 <drive> <remote name> - "
|
|
"these are not remembered\n");
|
|
printf("CancelConnect <drive> <r>\n");
|
|
printf("GetConnect <connection> <buffer size>\n");
|
|
printf("GetUniversalName <connection> <info level> <buffer size>\n");
|
|
printf("GetUser <device= ?> <bufsize= ?>\n");
|
|
printf("EnumConnect <type= ANY|DISK|PRINT> <r> \n");
|
|
printf("EnumContext <type= ANY|DISK|PRINT> \n");
|
|
printf("RestoreConnect <drive> \n");
|
|
printf("EnumNet\n");
|
|
printf("SetError\n");
|
|
printf("MultiError\n");
|
|
printf("DirApi\n");
|
|
printf("ClearConnect\n");
|
|
printf("LogonNotify\n");
|
|
printf("ChangePassword\n");
|
|
printf("ALL\n");
|
|
printf("InvalidParms\n");
|
|
printf("Loop <number> - Add and cancel n connections \n");
|
|
printf("Exit\n");
|
|
}
|
|
|