mirror of https://github.com/lianthony/NT4.0
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.
282 lines
11 KiB
282 lines
11 KiB
/*
|
|
NETFILE.C -- a sample program demonstrating NetFile API functions.
|
|
|
|
This program requires that you have admin privilege on the specified
|
|
server.
|
|
|
|
usage: netfile [-s \\server] [-p basepath] [-u username]
|
|
[-f functions]] [-l level]
|
|
[-b buffersize] [-e enumbuffersize]
|
|
|
|
where \\server = Name of the server. A servername must be preceded by
|
|
two backslashes (\\).
|
|
basepath = Enumerate only _open files along this path.
|
|
username = Enumerate only files opened by this user.
|
|
functions = List of functions to run.
|
|
buffersize = size of buffer for GetInfo.
|
|
enumbuffersize = size of buffer for Enum.
|
|
|
|
API Used to...
|
|
=============== ================================================
|
|
NetFileEnum2 List files in the base path opened by user
|
|
NetFileGetInfo2 Get information available about each listed file
|
|
NetFileClose2 Close specified files on the specified server
|
|
|
|
This sample code is provided for demonstration purposes only.
|
|
Microsoft makes no warranty, either express or implied,
|
|
as to its usability in any given situation.
|
|
|
|
*/
|
|
|
|
#define INCL_NETFILE
|
|
#define INCL_NETERRORS
|
|
#include <lan.h> // LAN Manager header files
|
|
|
|
#include <stdio.h> // C run-time header files
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "samples.h" // Internal routine header file
|
|
|
|
#define BIGBUFFERSIZE 4096
|
|
|
|
void Usage(char *pszString);
|
|
|
|
void main(int argc, char *argv[])
|
|
{
|
|
char *pszServerName = ""; // Required parameters for calls
|
|
char far *pszBasePath = "C:\\";
|
|
char far *pszUserName = (char far *) NULL;
|
|
API_RET_TYPE uReturnCode; // API return codes
|
|
int iCount; // Index counter
|
|
unsigned short sLevel = 2;
|
|
unsigned short bufferSize = BIGBUFFERSIZE;
|
|
unsigned short enumBufferSize = BIGBUFFERSIZE;
|
|
char * pbBuffer;
|
|
unsigned short cbBuflen; // Count of bytes
|
|
unsigned short cEntriesRead; // Entries read
|
|
unsigned short cEntriesRemaining; // Entries remaining to be read
|
|
unsigned short cGetEntries = 0; // Count of all enumerated IDs
|
|
unsigned short cbTotalAvail; // Count of bytes available
|
|
unsigned short fTableAllocated = 0; // Flag to build table of IDs
|
|
struct file_info_2 *pBuf2; // File IDs; use only level 2,3
|
|
struct file_info_3 *pBuf3; // File IDs; use only level 2,3
|
|
FRK resumekey; // File resume key, used when enum data > buffer size
|
|
unsigned long *pulIds, *pulStartId; // List of file IDs
|
|
char * commands = "EGC";
|
|
char * function;
|
|
char *args[50];
|
|
int numArgs;
|
|
|
|
numArgs = GetEnvDefaults( "NETFILE_DEFAULTS", argc, argv, args );
|
|
|
|
for (iCount = 0; iCount < numArgs; iCount++)
|
|
{
|
|
if ((*args[iCount] == '-') || (*args[iCount] == '/'))
|
|
{
|
|
switch (tolower(*(args[iCount]+1))) // Process switches
|
|
{
|
|
case 's': // -s servername
|
|
pszServerName = args[++iCount];
|
|
break;
|
|
case 'l': // -l level
|
|
sLevel = (short)(atoi(args[++iCount]));
|
|
break;
|
|
case 'p': // -p base path
|
|
pszBasePath = (char far *)args[++iCount];
|
|
break;
|
|
case 'u': // -u username
|
|
pszUserName = (char far *)args[++iCount];
|
|
break;
|
|
case 'b':
|
|
bufferSize = (unsigned short)(atoi(args[++iCount]));
|
|
break;
|
|
case 'e':
|
|
enumBufferSize = (unsigned short)(atoi(args[++iCount]));
|
|
break;
|
|
case 'f':
|
|
commands = _strupr(args[++iCount]);
|
|
break;
|
|
case 'h':
|
|
default:
|
|
Usage(argv[0]);
|
|
}
|
|
}
|
|
else
|
|
Usage(argv[0]);
|
|
} // End for loop
|
|
|
|
printf("\nFile Category API Examples\n");
|
|
if (pszServerName[0] != '\0')
|
|
printf("Server = %s\n", pszServerName);
|
|
if (pszBasePath != NULL)
|
|
printf("Base path = %s\n", pszBasePath);
|
|
if (pszUserName != NULL)
|
|
printf("User name = %s\n", pszUserName);
|
|
|
|
//========================================================================
|
|
//
|
|
// Loop through command string, executing functions.
|
|
//
|
|
//========================================================================
|
|
|
|
for (function = commands; *function != '\0'; function++) {
|
|
|
|
//========================================================================
|
|
// NetFileEnum2
|
|
//
|
|
// This API lists all open files on the server below the specified given
|
|
// base path. If no base path is given, all open files are listed.
|
|
//========================================================================
|
|
|
|
if ( *function == 'E' ) {
|
|
cbBuflen = enumBufferSize;
|
|
pbBuffer = SafeMalloc(cbBuflen);
|
|
pBuf2 = (struct file_info_2 *) pbBuffer;
|
|
pBuf3 = (struct file_info_3 *) pbBuffer;
|
|
|
|
FRK_INIT(resumekey); // Must init file resume key; use SHARES.H macro
|
|
|
|
do // Use resume key and loop until done
|
|
{
|
|
uReturnCode = NetFileEnum2(pszServerName, // NULL means local
|
|
pszBasePath, // NULL means root
|
|
pszUserName, // NULL means all users
|
|
sLevel, // Level (0 through 3)
|
|
(char far *)pbBuffer, // Return buffer
|
|
cbBuflen, // Return buffer length
|
|
&cEntriesRead, // Count of entries read
|
|
&cEntriesRemaining, // Entries not read
|
|
&resumekey); // Resume key
|
|
|
|
printf("NetFileEnum2 returned %u\n", uReturnCode);
|
|
if (uReturnCode == NERR_Success || uReturnCode == ERROR_MORE_DATA)
|
|
{
|
|
printf("Resume handle %ld, %d, %d", resumekey.res_pad,
|
|
resumekey.res_fs,
|
|
resumekey.res_pro
|
|
);
|
|
printf(" Entries read = %hu, Entries remaining = %hu\n",
|
|
cEntriesRead, cEntriesRemaining);
|
|
// Save the file IDs.
|
|
if (cEntriesRead > 0)
|
|
{
|
|
// Allocate memory for file ID table first time through only.
|
|
if (fTableAllocated == 0)
|
|
{
|
|
cGetEntries = cEntriesRead + cEntriesRemaining;
|
|
pulStartId = pulIds = (unsigned long *)
|
|
SafeMalloc(cGetEntries * sizeof(unsigned long));
|
|
fTableAllocated = 1; // Assure allocate only once
|
|
}
|
|
|
|
// Print the file information.
|
|
printf(" Id Perms Locks User Path\n");
|
|
for (iCount = 0; iCount < (int) cEntriesRead; iCount++)
|
|
{
|
|
switch( sLevel ) {
|
|
case 2:
|
|
printf(" %-8lu\n", pBuf2->fi2_id );
|
|
*pulIds = pBuf2->fi2_id;
|
|
pulIds++;
|
|
pBuf2++;
|
|
break;
|
|
case 3:
|
|
printf(" %-8lu%-8hu%-8hu%-16Fs%Fs\n", pBuf3->fi3_id,
|
|
pBuf3->fi3_permissions, pBuf3->fi3_num_locks,
|
|
pBuf3->fi3_username, pBuf3->fi3_pathname);
|
|
*pulIds = pBuf3->fi3_id;
|
|
pulIds++;
|
|
pBuf3++;
|
|
break;
|
|
default:
|
|
fTableAllocated = 0;
|
|
}
|
|
|
|
} // End for loop
|
|
|
|
pBuf2 = (struct file_info_2 *) pbBuffer;
|
|
pBuf3 = (struct file_info_3 *) pbBuffer;
|
|
|
|
} // End if cEntriesRead > 0
|
|
} // End if successful call
|
|
} while (uReturnCode == ERROR_MORE_DATA); // Use FRK until enum all
|
|
free(pbBuffer);
|
|
}
|
|
|
|
//========================================================================
|
|
// NetFileGetInfo2
|
|
//
|
|
// This API retrieves all file IDs listed from the NetFileEnum2 call.
|
|
//========================================================================
|
|
|
|
if ( *function == 'G' ) {
|
|
|
|
if (cGetEntries != 0)
|
|
{
|
|
cbBuflen = bufferSize;
|
|
pbBuffer = SafeMalloc(cbBuflen);
|
|
pBuf3 = (struct file_info_3 *) pbBuffer;
|
|
|
|
pulIds = pulStartId; // Start at beginning of list
|
|
printf("NetFileGetInfo2 results:\n");
|
|
for (iCount = 0; iCount < (int) cGetEntries; iCount++)
|
|
{
|
|
uReturnCode = NetFileGetInfo2(
|
|
pszServerName, // NULL means local
|
|
*pulIds, // File ID from enum
|
|
3, // Level (0 through 3)
|
|
(char far *)pbBuffer, // Return buffer
|
|
cbBuflen, // Return buffer length
|
|
&cbTotalAvail); // Entries not yet read
|
|
|
|
if (uReturnCode) {
|
|
printf("NetFileGetInfo2 for file %lu returned %u\n",
|
|
*pulIds, uReturnCode);
|
|
} else {
|
|
printf(" File %lu: %-8hu%-8hu%-16Fs%Fs\n", *pulIds,
|
|
pBuf3->fi3_permissions, pBuf3->fi3_num_locks,
|
|
pBuf3->fi3_username, pBuf3->fi3_pathname);
|
|
}
|
|
pulIds++;
|
|
}
|
|
}
|
|
free(pbBuffer);
|
|
}
|
|
|
|
//========================================================================
|
|
// NetFileClose2
|
|
//
|
|
// This API closes the specified open files on the specified server.
|
|
//========================================================================
|
|
|
|
if ( *function == 'C' ) {
|
|
if (cGetEntries != 0)
|
|
{
|
|
pulIds = pulStartId;
|
|
for (iCount = 0; iCount < (int) cGetEntries; iCount++)
|
|
{
|
|
uReturnCode = NetFileClose2(pszServerName, // NULL means local
|
|
(unsigned long)*pulIds); // File ID from enum
|
|
|
|
printf("NetFileClose2 for file %lu returned %u\n",
|
|
*pulIds, uReturnCode);
|
|
pulIds++;
|
|
}
|
|
free(pulStartId);
|
|
}
|
|
}
|
|
}
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
void Usage(char *pszString)
|
|
{
|
|
fprintf(stderr, "Usage: %s [-s \\\\server] [-b basepath] [-u username]\n"
|
|
"\t\t[-f [e][g][c]] [-l level]\n"
|
|
"\t\t[-b buffersize] [-e enumbuffersize]",
|
|
pszString);
|
|
exit(1);
|
|
}
|