Leaked source code of windows server 2003
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.
 
 
 
 
 
 

716 lines
19 KiB

// OpenF.cpp : Implementation of COpenF
/***************************************************************************************
Copyright information : Microsoft Corp. 1981-1999. All rights reserved
File Name : OpenF.cpp
Created By : A.V. Kiran Kumar
Date of Creation (dd/mm/yy) : 13/02/01
Version Number : 0.1
Brief Description : This file implements COpenF. This file is intended to
have the functionality for getting the list of open files.
***************************************************************************************/
#include "stdafx.h"
#include "OpenFiles.h"
#include "OpenF.h"
/////////////////////////////////////////////////////////////////////////////
// COpenF
// ***************************************************************************
//
// Name : getOpenFiles
//
// Synopsis : This function gets the list of open files.
//
// Parameters : VARIANT*(out, retval) pOpenFiles - List of open files
//
// Return Type : DWORD
//
//
// ***************************************************************************
STDMETHODIMP COpenF::getOpenFiles(VARIANT *pOpenFiles)
{
DWORD dwEntriesRead = 0;// Receives the total number of openfiles
DWORD dwTotalEntries = 0;//Receives the total number of entries read
DWORD dwResumeHandle = 0;//Contains a resume handle which is used to
//continue an existing file search.
LPFILE_INFO_3 pFileInfo3_1 = NULL;// LPFILE_INFO_3 structure contains the
// pertinent information about files.
DWORD dwError = 0;
DWORD dwRetval = S_OK;
DWORD dwCount = 0;//Count which indicates the number of openfiles
LPFILE_INFO_3 dummyPtr = NULL;
//Get information about some or all open files on a server
dwError = NetFileEnum( NULL,
NULL,
NULL,
FILE_INFO_3,
(LPBYTE*)&pFileInfo3_1,
MAX_PREFERRED_LENGTH,
&dwEntriesRead,
&dwTotalEntries,
NULL );
if(dwError == ERROR_ACCESS_DENIED || dwError == ERROR_NOT_ENOUGH_MEMORY)
return dwError; // The user does not have access to the requested information.
//Get the count of OpenFiles on Macinthosh machine
DWORD dwMacCount = 0;
if ( dwError = GetMacOpenFileCount(&dwMacCount) )
dwRetval = dwError;
//Get the count of OpenFiles on Netware machine
DWORD dwNwCount = 0;
if ( dwError = GetNwOpenFileCount(&dwNwCount) )
dwRetval = dwError;
//Fill the safearray bounds structure with the dimensions of the safe array. The lower bound
//is 0 and the number of rows is dwTotalEntries and number of columns is 3
pSab[0].lLbound = 0;
pSab[0].cElements = dwTotalEntries + dwMacCount + dwNwCount;
pSab[1].lLbound = 0;
pSab[1].cElements = 3;
//Create the safe array descriptor, allocate and initialize the data for the array
pSa = SafeArrayCreate( VT_VARIANT, 2, pSab );
if(pSa == NULL)
return ERROR_NOT_ENOUGH_MEMORY;
//Enumerate all the openfiles
do
{
//Some more files are to be enumerated get them by calling NetFileEnum again
dwError = NetFileEnum( NULL, NULL, NULL, FILE_INFO_3,
(LPBYTE*)&pFileInfo3_1,
MAX_PREFERRED_LENGTH,
&dwEntriesRead,
&dwTotalEntries,
(unsigned long*)&dwResumeHandle );
if(dwError == ERROR_ACCESS_DENIED || dwError == ERROR_NOT_ENOUGH_MEMORY)
return dwError;
dummyPtr = pFileInfo3_1;
// Get the open files once NetFileEnum is successully called
if( dwError == NERR_Success || dwError == ERROR_MORE_DATA )
{
for ( DWORD dwFile = 0; dwFile < dwEntriesRead; dwFile++, pFileInfo3_1++ )
{
BSTR userName;
BSTR openMode;
BSTR pathName;
VARIANT vuserName;
VARIANT vopenMode;
VARIANT vpathName;
// Accessed By
if(lstrlen(pFileInfo3_1->fi3_username))
userName = (BSTR)pFileInfo3_1->fi3_username;
else
userName = L"NOT_AVAILABLE"; //User name is not available
// Checks for open file mode
const DWORD READWRITE = PERM_FILE_READ | PERM_FILE_WRITE;
const DWORD READCREATE = PERM_FILE_READ | PERM_FILE_CREATE;
const DWORD WRITECREATE = PERM_FILE_WRITE | PERM_FILE_CREATE;
switch(pFileInfo3_1->fi3_permissions)
{
case PERM_FILE_READ:
openMode = L"READ";
break;
case PERM_FILE_WRITE:
openMode = L"WRITE";
break;
case PERM_FILE_CREATE:
openMode = L"CREATE";
break;
case READWRITE:
openMode = L"READ+WRITE";
break;
case READCREATE:
openMode = L"READ+CREATE";
break;
case WRITECREATE:
openMode = L"WRITE+CREATE";
break;
default:
openMode = L"NOACCESS";
}
//Get the filename from the structure
pathName = (BSTR)pFileInfo3_1->fi3_pathname;
//Initialize the row index and column index at which filename is to be stored in the Safearray
long index[2] = {dwCount, 0};
VariantInit( &vpathName ); //Initialize the variant
vpathName.vt = VT_BSTR; //Data type to be stored is BSTR
vpathName.bstrVal = SysAllocString(pathName);
//Store the filename in Safearray
HRESULT hr;
hr = SafeArrayPutElement( pSa, index, &vpathName );
if( FAILED(hr) )
return hr;
//Store username in the second column
index[ 1 ] = 1;
VariantInit( &vuserName );
vuserName.vt = VT_BSTR;
vuserName.bstrVal = SysAllocString(userName);
//Store the username in the safearray
hr = SafeArrayPutElement( pSa, index, &vuserName );
if( FAILED(hr) )
return hr;
//Store OpenMode in the third column
index[ 1 ] = 2;
VariantInit( &vopenMode );
vopenMode.vt = VT_BSTR;
vopenMode.bstrVal = SysAllocString(openMode);
//Store the OpenMode in the safearray
hr = SafeArrayPutElement( pSa, index, &vopenMode );
if( FAILED(hr) )
return hr;
//Clear all the variants that are initilized
VariantClear(&vuserName);
VariantClear(&vopenMode);
VariantClear(&vpathName);
dwCount++;
}// End for loop
}
// Free the block allocated for retrieving the OpenFile info
if( dummyPtr !=NULL)
{
NetApiBufferFree( dummyPtr );
pFileInfo3_1 = NULL;
}
} while ( dwError == ERROR_MORE_DATA );
//Get the list of Open Files on Macinthosh OS
if( dwMacCount > 0 )
{
if ( dwError = GetMacOpenF(pSa, dwTotalEntries ) )
dwRetval = dwError;
}
//Get the list of Open Files on Netware OS
if( dwNwCount > 0 )
{
if ( dwError = GetNwOpenF(pSa, dwTotalEntries + dwMacCount ) )
dwRetval = dwError;
}
//Return the safe array to the calling function
VariantInit( pOpenFiles );
pOpenFiles->vt = VT_VARIANT | VT_ARRAY;
pOpenFiles->parray = pSa;
return dwRetval;
}
// ***************************************************************************
//
// Name : GetMacOpenF
//
// Synopsis : This function gets the list of open files on Machinthosh OS.
//
// Parameters : SAFEARRAY* (out, retval) - List of open files
// : DWORD dwIndex Safe array Index
//
// Return Type : DWORD
//
//
// ***************************************************************************
DWORD COpenF::GetMacOpenF(SAFEARRAY *pSa, DWORD dwIndex)
{
DWORD dwEntriesRead = 0;// Receives the count of elements
DWORD dwTotalEntries = 0;//Receives the total number of entries
DWORD hEnumHandle = 0;//Contains a resume handle which is used to
//continue an existing file search.
AFP_FILE_INFO* pfileinfo = NULL; // Structure contains the
// pertinent information about files
HRESULT hr = S_OK;
NET_API_STATUS retval = NERR_Success;
DWORD ulSFMServerConnection = 0;
DWORD retval_connect = 0;
LPWSTR ServerName = NULL;
retval_connect = AfpAdminConnect(
ServerName,
&ulSFMServerConnection );
if(retval_connect)
return retval_connect;
DWORD dwCount = dwIndex;
DWORD retval_FileEnum;
//Enumerate all the openfiles
do
{
//Some more files are to be enumerated get them by calling AfpAdminFileEnum again
retval_FileEnum = AfpAdminFileEnum(
ulSFMServerConnection,
(PBYTE*)&pfileinfo,
(DWORD)-1L,
&dwEntriesRead,
&dwTotalEntries,
&hEnumHandle );
if( retval_FileEnum == ERROR_ACCESS_DENIED || retval_FileEnum == ERROR_NOT_ENOUGH_MEMORY )
return retval_FileEnum; // The user does not have access to the requested information.
AFP_FILE_INFO* dummyPtr = pfileinfo;
// Get the open files once NetFileEnum is successully called
if( retval_FileEnum == NERR_Success || retval_FileEnum == ERROR_MORE_DATA )
{
for ( DWORD dwFile = 0; dwFile < dwEntriesRead; dwFile++, pfileinfo++ )
{
BSTR userName;
BSTR openMode;
BSTR pathName;
VARIANT vuserName;
VARIANT vopenMode;
VARIANT vpathName;
// Accessed By
if(lstrlen(pfileinfo->afpfile_username))
userName = (BSTR)pfileinfo->afpfile_username;
else
userName = L"NOT_AVAILABLE"; //User name is not available
// Checks for open file mode
const DWORD READWRITE = PERM_FILE_READ | PERM_FILE_WRITE;
const DWORD READCREATE = PERM_FILE_READ | PERM_FILE_CREATE;
const DWORD WRITECREATE = PERM_FILE_WRITE | PERM_FILE_CREATE;
switch(pfileinfo->afpfile_open_mode)
{
case PERM_FILE_READ:
openMode = L"READ";
break;
case PERM_FILE_WRITE:
openMode = L"WRITE";
break;
case PERM_FILE_CREATE:
openMode = L"CREATE";
break;
case READWRITE:
openMode = L"READ+WRITE";
break;
case READCREATE:
openMode = L"READ+CREATE";
break;
case WRITECREATE:
openMode = L"WRITE+CREATE";
break;
default:
openMode = L"NOACCESS";
}
//Get the filename from the structure
pathName = (BSTR)pfileinfo->afpfile_path;
//Initialize the row index and column index filename to be stored in the Safearray
long index[2] = {dwCount, 0};
VariantInit( &vpathName ); //Initialize the variant
vpathName.vt = VT_BSTR; //Data type to be stored is BSTR
vpathName.bstrVal = SysAllocString(pathName);
//Store the filename in Safearray
hr = SafeArrayPutElement( pSa, index, &vpathName );
if( FAILED(hr) )
return hr;
//Store filename in the second column
index[ 1 ] = 1;
VariantInit( &vuserName );
vuserName.vt = VT_BSTR;
vuserName.bstrVal = SysAllocString(userName);
//Store the username in the safearray
hr = SafeArrayPutElement( pSa, index, &vuserName );
if( FAILED(hr) )
return hr;
//Store OpenMode in the third column
index[ 1 ] = 2;
VariantInit( &vopenMode );
vopenMode.vt = VT_BSTR;
vopenMode.bstrVal = SysAllocString(openMode);
//Store the OpenMode in the safearray
hr = SafeArrayPutElement( pSa, index, &vopenMode );
if( FAILED(hr) )
return hr;
//Clear all the variants that are initilized
VariantClear(&vuserName);
VariantClear(&vopenMode);
VariantClear(&vpathName);
dwCount++;
}// End for loop
}
// Free the block allocated for retrieving the OpenFile info
if( dummyPtr !=NULL)
{
NetApiBufferFree( dummyPtr );
pfileinfo = NULL;
}
} while ( retval_FileEnum == ERROR_MORE_DATA );
return 0;
}
// ***************************************************************************
//
// Name : GetMacOpenFileCount
//
// Synopsis : This function gets the count of open files on Machinthosh OS.
//
// Parameters : DWORD dwIndex Safe array Index
//
// Return Type : DWORD
//
//
// ***************************************************************************
DWORD COpenF::GetMacOpenFileCount(LPDWORD lpdwCount)
{
DWORD dwEntriesRead = 0;// Receives the count of elements
DWORD dwTotalEntries = 0;//Receives the total number of entries
AFP_FILE_INFO* pfileinfo = NULL; // Structure contains the
// identification number and other
// pertinent information about files
HRESULT hr = S_OK;
NET_API_STATUS retval = NERR_Success;
DWORD ulSFMServerConnection = 0;
hMacModule = ::LoadLibrary (_TEXT("sfmapi.dll"));
if(hMacModule==NULL)
return ERROR_DLL_INIT_FAILED;
AfpAdminConnect = (CONNECTPROC)::GetProcAddress (hMacModule,"AfpAdminConnect");
if(AfpAdminConnect==NULL)
return ERROR_DLL_INIT_FAILED;
DWORD retval_connect = AfpAdminConnect(
NULL,
&ulSFMServerConnection );
if(retval_connect!=0)
return retval_connect;
AfpAdminFileEnum = (FILEENUMPROCMAC)::GetProcAddress (hMacModule,"AfpAdminFileEnum");
if(AfpAdminFileEnum==NULL)
return ERROR_DLL_INIT_FAILED;
//Get information about some or all open files on a server
DWORD retval_FileEnum = AfpAdminFileEnum(
ulSFMServerConnection,
(PBYTE*)&pfileinfo,
(DWORD)-1L,
&dwEntriesRead,
&dwTotalEntries,
NULL );
if( retval_FileEnum == ERROR_ACCESS_DENIED || retval_FileEnum == ERROR_NOT_ENOUGH_MEMORY )
return retval_FileEnum; // The user does not have access to the requested information.
*lpdwCount = dwTotalEntries;
if( pfileinfo !=NULL)
{
NetApiBufferFree( pfileinfo );
pfileinfo = NULL;
}
return 0;
}
// ***************************************************************************
//
// Name : GetNwOpenFileCount
//
// Synopsis : This function gets the count of open files on Netware OS.
//
// Parameters : DWORD dwIndex Safe array Index
//
// Return Type : DWORD
//
//
// ***************************************************************************
DWORD COpenF::GetNwOpenFileCount(LPDWORD lpdwCount)
{
DWORD dwEntriesRead = 0;// Receives the count of elements
FPNWFILEINFO* pfileinfo = NULL; // FPNWFILEINFO structure contains the
// identification number and other
// pertinent information about files,
// devices, and pipes.
NET_API_STATUS retval = NERR_Success;
DWORD dwError = 0;//Contains return value for "NetFileEnum" function
DWORD dwCount = 0;//Count which indicates the number of openfiles
*lpdwCount = 0; //Initialize the count to zero
hNwModule = ::LoadLibrary (_TEXT("FPNWCLNT.DLL"));
if(hNwModule==NULL)
return ERROR_DLL_INIT_FAILED;
FpnwFileEnum = (FILEENUMPROC)::GetProcAddress (hNwModule,"FpnwFileEnum");
if(FpnwFileEnum==NULL)
return ERROR_DLL_INIT_FAILED;
do
{
//Get information about some or all open files on a server
retval = FpnwFileEnum(
NULL,
1,
NULL,
(PBYTE*)&pfileinfo,
&dwEntriesRead,
NULL );
if( retval == ERROR_ACCESS_DENIED || retval == ERROR_NOT_ENOUGH_MEMORY )
return retval; // The user does not have access to the requested information.
*lpdwCount += dwEntriesRead;
}while( retval == ERROR_MORE_DATA );
if( pfileinfo !=NULL)
{
NetApiBufferFree( pfileinfo );
pfileinfo = NULL;
}
return 0;
}
// ***************************************************************************
//
// Name : GetNwOpenF
//
// Synopsis : This function gets the list of open files on Netware OS.
//
// Parameters : SAFEARRAY* (out, retval) - List of open files
// : DWORD dwIndex Safe array Index
//
// Return Type : DWORD
//
//
// ***************************************************************************
DWORD COpenF::GetNwOpenF(SAFEARRAY *pSa, DWORD dwIndex)
{
DWORD dwEntriesRead = 0;// Receives the count of elements
DWORD hEnumHandle = 0;//Contains a resume handle which is used to
//continue an existing file search.
FPNWFILEINFO* pfileinfo = NULL; // FPNWFILEINFO structure contains the
// pertinent information about files.
HRESULT hr = S_OK;
NET_API_STATUS retval = NERR_Success;
DWORD dwCount = dwIndex;
//Enumerate all the openfiles
do
{
//Some more files are to be enumerated get them by calling NetFileEnum again
retval = FpnwFileEnum(
NULL,
1,
NULL,
(PBYTE*)&pfileinfo,
&dwEntriesRead,
NULL );
if( retval == ERROR_ACCESS_DENIED || retval == ERROR_NOT_ENOUGH_MEMORY )
return retval; // The user does not have access to the requested information.
FPNWFILEINFO* dummyPtr = pfileinfo;
// Get the open files once NetFileEnum is successully called
if( retval == NERR_Success || retval == ERROR_MORE_DATA )
{
for ( DWORD dwFile = 0; dwFile < dwEntriesRead; dwFile++, pfileinfo++ )
{
BSTR userName;
BSTR openMode;
BSTR pathName;
VARIANT vuserName;
VARIANT vopenMode;
VARIANT vpathName;
// Accessed By
if(lstrlen(pfileinfo->lpUserName))
userName = (BSTR)pfileinfo->lpUserName;
else
userName = L"NOT_AVAILABLE"; //User name is not available
// Checks for open file mode
const DWORD READWRITE = FPNWFILE_PERM_READ | FPNWFILE_PERM_WRITE;
const DWORD READCREATE = FPNWFILE_PERM_READ | FPNWFILE_PERM_CREATE;
const DWORD WRITECREATE = FPNWFILE_PERM_WRITE | FPNWFILE_PERM_CREATE;
switch(pfileinfo->dwPermissions)
{
case FPNWFILE_PERM_READ:
openMode = L"READ";
break;
case FPNWFILE_PERM_WRITE:
openMode = L"WRITE";
break;
case FPNWFILE_PERM_CREATE:
openMode = L"CREATE";
break;
case READWRITE:
openMode = L"READ+WRITE";
break;
case READCREATE:
openMode = L"READ+CREATE";
break;
case WRITECREATE:
openMode = L"WRITE+CREATE";
break;
default:
openMode = L"NOACCESS";
}
//Get the filename from the structure
pathName = (BSTR)pfileinfo->lpPathName;
//Initialize the row index and column index filename to be stored in the Safearray
long index[2] = {dwCount, 0};
VariantInit( &vpathName ); //Initialize the variant
vpathName.vt = VT_BSTR; //Data type to be stored is BSTR
vpathName.bstrVal = SysAllocString(pathName);
//Store the filename in Safearray
hr = SafeArrayPutElement( pSa, index, &vpathName );
if( FAILED(hr) )
return hr;
//Store filename in the second column
index[ 1 ] = 1;
VariantInit( &vuserName );
vuserName.vt = VT_BSTR;
vuserName.bstrVal = SysAllocString(userName);
//Store the username in the safearray
hr = SafeArrayPutElement( pSa, index, &vuserName );
if( FAILED(hr) )
return hr;
//Store OpenMode in the third column
index[ 1 ] = 2;
VariantInit( &vopenMode );
vopenMode.vt = VT_BSTR;
vopenMode.bstrVal = SysAllocString(openMode);
//Store the OpenMode in the safearray
hr = SafeArrayPutElement( pSa, index, &vopenMode );
if( FAILED(hr) )
return hr;
//Clear all the variants that are initilized
VariantClear(&vuserName);
VariantClear(&vopenMode);
VariantClear(&vpathName);
dwCount++;
}// End for loop
}
// Free the block allocated for retrieving the OpenFile info
if( dummyPtr !=NULL)
{
NetApiBufferFree( dummyPtr );
pfileinfo = NULL;
}
}while( retval == ERROR_MORE_DATA );
return 0;
}