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
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;
|
|
}
|