|
|
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
ApiChDev.c
Abstract:
This module contains individual API handlers for the NetCharDev and NetCharDevQ APIs. Supported APIs are NetCharDevControl, NetCharDevEnum, NetCharDevGetInfo, NetCharDevQEnum, NetCharDevQGetInfo, NetCharDevQPurge, NetCharDevQPurgeSelf, and NetCharDevQSetInfo.
SUPPORTED: NetCharDevControl, NetCharDevEnum, NetCharDevGetInfo, NetCharDevQEnum, NetCharDevQGetInfo, NetCharDevQPurge, NetCharDevQPurgeSelf, NetCharDevQSetInfo.
!!! Remove handlers for unsupported APIs when done.
Author:
Shanku Niyogi (w-shanku) 06-Mar-1991
Revision History:
--*/
#include "XactSrvP.h"
//
// Declaration of descriptor strings.
//
#if 0
STATIC const LPDESC Desc16_chardev_info_0 = REM16_chardev_info_0; STATIC const LPDESC Desc32_chardev_info_0 = REM32_chardev_info_0; STATIC const LPDESC Desc16_chardev_info_1 = REM16_chardev_info_1; STATIC const LPDESC Desc32_chardev_info_1 = REM32_chardev_info_1; STATIC const LPDESC Desc16_chardevQ_info_0 = REM16_chardevQ_info_0; STATIC const LPDESC Desc32_chardevQ_info_0 = REM32_chardevQ_info_0; STATIC const LPDESC Desc16_chardevQ_info_1 = REM16_chardevQ_info_1; STATIC const LPDESC Desc32_chardevQ_info_1 = REM32_chardevQ_info_1; STATIC const LPDESC Desc16_chardevQ_info_1_setinfo = REM16_chardevQ_info_1_setinfo; STATIC const LPDESC Desc32_chardevQ_info_1_setinfo = REM32_chardevQ_info_1_setinfo; #endif
#define RETURN_CHARDEV_NOT_SUPPORTED \
API_HANDLER_PARAMETERS_REFERENCE; \ Header->Status = ERROR_NOT_SUPPORTED;
NTSTATUS XsNetCharDevControl ( API_HANDLER_PARAMETERS )
/*++
Routine Description:
This routine handles a call to NetCharDevControl.
Arguments:
API_HANDLER_PARAMETERS - information about the API call. See XsTypes.h for details.
Return Value:
NTSTATUS - STATUS_SUCCESS or reason for failure.
--*/
{ #if 0
NET_API_STATUS status;
PXS_NET_CHAR_DEV_CONTROL parameters = Parameters; LPTSTR nativeDevName = NULL; // Native parameters
API_HANDLER_PARAMETERS_REFERENCE; // Avoid warnings
//
// Translate parameters, check for errors.
//
XsConvertTextParameter( nativeDevName, (LPSTR)SmbGetUlong( ¶meters->DevName ) );
//
// Make the local call.
//
status = NetCharDevControl( NULL, nativeDevName, (DWORD)SmbGetUshort( ¶meters->OpCode ) );
if ( !XsApiSuccess( status )) { IF_DEBUG(ERRORS) { NetpKdPrint(( "XsNetCharDevControl: " "NetCharDevControl failed: %X\n", status )); } }
cleanup:
NetpMemoryFree( nativeDevName );
//
// No return data.
//
Header->Status = (WORD)status; #else
RETURN_CHARDEV_NOT_SUPPORTED; #endif
return STATUS_SUCCESS;
} // XsNetCharDevControl
NTSTATUS XsNetCharDevEnum ( API_HANDLER_PARAMETERS )
/*++
Routine Description:
This routine handles a call to NetCharDevEnum.
Arguments:
API_HANDLER_PARAMETERS - information about the API call. See XsTypes.h for details.
Return Value:
NTSTATUS - STATUS_SUCCESS or reason for failure.
--*/
{
PXS_NET_CHAR_DEV_ENUM parameters = Parameters; DWORD entriesFilled = 0; #if 0
NET_API_STATUS status;
LPVOID outBuffer = NULL; // Native parameters
DWORD entriesRead; DWORD totalEntries;
DWORD bytesRequired = 0; // Conversion variables
LPDESC nativeStructureDesc;
API_HANDLER_PARAMETERS_REFERENCE; // Avoid warnings
IF_DEBUG(CHAR_DEV) { NetpKdPrint(( "XsNetCharDevEnum: header at %lx, params at %lx, " "level %ld, buf size %ld\n", Header, parameters, SmbGetUshort( ¶meters->Level ), SmbGetUshort( ¶meters->BufLen ))); }
//
// Check for errors.
//
if ( XsWordParamOutOfRange( parameters->Level, 0, 1 )) {
Header->Status = (WORD)ERROR_INVALID_LEVEL; goto cleanup; }
//
// Make the local call.
//
status = NetCharDevEnum( NULL, (DWORD)SmbGetUshort( ¶meters->Level ), (LPBYTE *)&outBuffer, XsNativeBufferSize( SmbGetUshort( ¶meters->BufLen )), &entriesRead, &totalEntries, NULL );
if ( !XsApiSuccess( status )) { IF_DEBUG(API_ERRORS) { NetpKdPrint(( "XsNetCharDevEnum: NetCharDevEnum failed: %X\n", status )); } Header->Status = (WORD)status; goto cleanup; }
IF_DEBUG(CHAR_DEV) { NetpKdPrint(( "XsNetCharDevEnum: received %ld entries at %lx\n", entriesRead, outBuffer )); }
//
// Use the requested level to determine the format of the
// data structure.
//
switch ( SmbGetUshort( ¶meters->Level ) ) {
case 0:
nativeStructureDesc = Desc32_chardev_info_0; StructureDesc = Desc16_chardev_info_0; break;
case 1:
nativeStructureDesc = Desc32_chardev_info_1; StructureDesc = Desc16_chardev_info_1; break;
}
//
// Do the actual conversion from the 32-bit structures to 16-bit
// structures.
//
XsFillEnumBuffer( outBuffer, entriesRead, nativeStructureDesc, (LPVOID)SmbGetUlong( ¶meters->Buffer ), (LPVOID)SmbGetUlong( ¶meters->Buffer ), SmbGetUshort( ¶meters->BufLen ), StructureDesc, NULL, // verify function
&bytesRequired, &entriesFilled, NULL );
IF_DEBUG(CHAR_DEV) { NetpKdPrint(( "32-bit data at %lx, 16-bit data at %lx, %ld BR," " Entries %ld of %ld\n", outBuffer, SmbGetUlong( ¶meters->Buffer ), bytesRequired, entriesFilled, totalEntries )); }
//
// The 16-bit chardev_info structures do not contain any variable
// data. Therefore, there is no need to pack any data - the converter
// is already set to 0.
//
if ( entriesFilled < totalEntries ) {
Header->Status = ERROR_MORE_DATA;
}
//
// Set up the response parameters.
//
SmbPutUshort( ¶meters->EntriesRead, (WORD)entriesFilled ); SmbPutUshort( ¶meters->TotalAvail, (WORD)totalEntries );
cleanup:
NetApiBufferFree( outBuffer );
#else
RETURN_CHARDEV_NOT_SUPPORTED; #endif
//
// Determine return buffer size.
//
XsSetDataCount( ¶meters->BufLen, StructureDesc, Header->Converter, entriesFilled, Header->Status );
return STATUS_SUCCESS;
} // XsNetCharDevEnum
NTSTATUS XsNetCharDevGetInfo ( API_HANDLER_PARAMETERS )
/*++
Routine Description:
This routine handles a call to NetCharDevGetInfo.
Arguments:
API_HANDLER_PARAMETERS - information about the API call. See XsTypes.h for details.
Return Value:
NTSTATUS - STATUS_SUCCESS or reason for failure.
--*/
{
PXS_NET_CHAR_DEV_GET_INFO parameters = Parameters; #if 0
NET_API_STATUS status;
LPTSTR nativeDevName = NULL; // Native parameters
LPVOID outBuffer = NULL;
LPBYTE stringLocation = NULL; // Conversion variables
DWORD bytesRequired = 0; LPDESC nativeStructureDesc;
API_HANDLER_PARAMETERS_REFERENCE; // Avoid warnings
IF_DEBUG(CHAR_DEV) { NetpKdPrint(( "XsNetCharDevGetInfo: header at %lx, " "params at %lx, level %ld\n", Header, parameters, SmbGetUshort( ¶meters->Level ) )); }
//
// Translate parameters, check for errors.
//
if ( XsWordParamOutOfRange( parameters->Level, 0, 1 )) {
Header->Status = (WORD)ERROR_INVALID_LEVEL; goto cleanup; }
XsConvertTextParameter( nativeDevName, (LPSTR)SmbGetUlong( ¶meters->DevName ) );
//
//
// Make the local call.
//
status = NetCharDevGetInfo( NULL, nativeDevName, (DWORD)SmbGetUshort( ¶meters->Level ), (LPBYTE *)&outBuffer );
if ( !XsApiSuccess( status )) { IF_DEBUG(API_ERRORS) { NetpKdPrint(( "XsNetCharDevGetInfo: NetCharDevGetInfo failed: " "%X\n", status )); } Header->Status = (WORD)status; goto cleanup;
}
//
// Use the requested level to determine the format of the
// data structure.
//
switch ( SmbGetUshort( ¶meters->Level ) ) {
case 0:
nativeStructureDesc = Desc32_chardev_info_0; StructureDesc = Desc16_chardev_info_0; break;
case 1:
nativeStructureDesc = Desc32_chardev_info_1; StructureDesc = Desc16_chardev_info_1; break;
}
//
// Convert the structure returned by the 32-bit call to a 16-bit
// structure. The last possible location for variable data is
// calculated from buffer location and length.
//
stringLocation = (LPBYTE)( SmbGetUlong( ¶meters->Buffer ) + SmbGetUshort( ¶meters->BufLen ) );
status = RapConvertSingleEntry( outBuffer, nativeStructureDesc, FALSE, (LPBYTE)SmbGetUlong( ¶meters->Buffer ), (LPBYTE)SmbGetUlong( ¶meters->Buffer ), StructureDesc, TRUE, &stringLocation, &bytesRequired, Response, NativeToRap );
if ( status != NERR_Success ) { IF_DEBUG(ERRORS) { NetpKdPrint(( "XsNetCharDevGetInfo: RapConvertSingleEntry failed: " "%X\n", status )); }
Header->Status = NERR_InternalError; goto cleanup; }
IF_DEBUG(CHAR_DEV) { NetpKdPrint(( "32-bit data at %lx, 16-bit data at %lx, %ld BR\n", outBuffer, SmbGetUlong( ¶meters->Buffer ), bytesRequired )); }
//
// Determine return code based on the size of the buffer. The 16-bit
// chardev_info structures do not have any variable data to pack.
//
if ( !XsCheckBufferSize( SmbGetUshort( ¶meters->BufLen ), StructureDesc, FALSE // not in native format
)) {
IF_DEBUG(ERRORS) { NetpKdPrint(( "XsNetCharDevGetInfo: Buffer too small.\n" )); } Header->Status = NERR_BufTooSmall;
} else if ( bytesRequired > SmbGetUshort( ¶meters-> BufLen )) {
IF_DEBUG(ERRORS) { NetpKdPrint(( "NetCharDevGetInfo: More data available.\n" )); } Header->Status = ERROR_MORE_DATA;
}
//
// Set up the response parameters.
//
SmbPutUshort( ¶meters->TotalAvail, (WORD)bytesRequired ); cleanup:
NetApiBufferFree( outBuffer ); NetpMemoryFree( nativeDevName );
#else
RETURN_CHARDEV_NOT_SUPPORTED; #endif
//
// Determine return buffer size.
//
XsSetDataCount( ¶meters->BufLen, StructureDesc, Header->Converter, 1, Header->Status );
return STATUS_SUCCESS;
} // XsNetCharDevGetInfo
NTSTATUS XsNetCharDevQEnum ( API_HANDLER_PARAMETERS )
/*++
Routine Description:
This routine handles a call to NetCharDevQEnum.
Arguments:
API_HANDLER_PARAMETERS - information about the API call. See XsTypes.h for details.
Return Value:
NTSTATUS - STATUS_SUCCESS or reason for failure.
--*/
{ PXS_NET_CHAR_DEV_Q_ENUM parameters = Parameters; DWORD entriesFilled = 0;
#if 0
NET_API_STATUS status;
LPTSTR nativeUserName = NULL; // Native parameters
LPVOID outBuffer = NULL; DWORD entriesRead; DWORD totalEntries;
DWORD bytesRequired = 0; LPDESC nativeStructureDesc;
API_HANDLER_PARAMETERS_REFERENCE; // Avoid warnings
IF_DEBUG(CHAR_DEV) { NetpKdPrint(( "XsNetCharDevQEnum: header at %lx, params at %lx, " "level %ld, buf size %ld\n", Header, parameters, SmbGetUshort( ¶meters->Level ), SmbGetUshort( ¶meters->BufLen ))); }
//
// Translate parameters, check for errors.
//
if ( XsWordParamOutOfRange( parameters->Level, 0, 1 )) {
Header->Status = (WORD)ERROR_INVALID_LEVEL; goto cleanup; }
XsConvertTextParameter( nativeUserName, (LPSTR)SmbGetUlong( ¶meters->UserName ) );
//
// Make the local call.
//
status = NetCharDevQEnum( NULL, nativeUserName, (DWORD)SmbGetUshort( ¶meters->Level ), (LPBYTE *)&outBuffer, XsNativeBufferSize( SmbGetUshort( ¶meters->BufLen )), &entriesRead, &totalEntries, NULL );
if ( !XsApiSuccess( status )) { IF_DEBUG(API_ERRORS) { NetpKdPrint(( "XsNetCharDevQEnum: NetCharDevQEnum failed: %X\n", status )); } Header->Status = (WORD)status; goto cleanup; }
IF_DEBUG(CHAR_DEV) { NetpKdPrint(( "XsNetCharDevQEnum: received %ld entries at %lx\n", entriesRead, outBuffer )); }
//
// Use the requested level to determine the format of the
// data structure.
//
switch ( SmbGetUshort( ¶meters->Level ) ) {
case 0:
nativeStructureDesc = Desc32_chardevQ_info_0; StructureDesc = Desc16_chardevQ_info_0; break;
case 1:
nativeStructureDesc = Desc32_chardevQ_info_1; StructureDesc = Desc16_chardevQ_info_1; break;
}
//
// Do the actual conversion from the 32-bit structures to 16-bit
// structures.
//
XsFillEnumBuffer( outBuffer, entriesRead, nativeStructureDesc, (LPVOID)SmbGetUlong( ¶meters->Buffer ), (LPVOID)SmbGetUlong( ¶meters->Buffer ), SmbGetUshort( ¶meters->BufLen ), StructureDesc, NULL, // verify function
&bytesRequired, &entriesFilled, NULL );
IF_DEBUG(CHAR_DEV) { NetpKdPrint(( "32-bit data at %lx, 16-bit data at %lx, %ld BR," " Entries %ld of %ld\n", outBuffer, SmbGetUlong( ¶meters->Buffer ), bytesRequired, entriesFilled, totalEntries )); }
//
// If all the data was returned, try to pack the data so that we
// don't send empty bytes back.
//
if ( entriesFilled < totalEntries ) {
Header->Status = ERROR_MORE_DATA;
} else {
Header->Converter = XsPackReturnData( (LPVOID)SmbGetUlong( ¶meters->Buffer ), SmbGetUshort( ¶meters->BufLen ), StructureDesc, entriesFilled ); }
//
// Set up the response parameters.
//
SmbPutUshort( ¶meters->EntriesRead, (WORD)entriesFilled ); SmbPutUshort( ¶meters->TotalAvail, (WORD)totalEntries );
cleanup:
NetApiBufferFree( outBuffer ); NetpMemoryFree( nativeUserName ); #else
RETURN_CHARDEV_NOT_SUPPORTED; #endif
//
// Determine return buffer size.
//
XsSetDataCount( ¶meters->BufLen, StructureDesc, Header->Converter, entriesFilled, Header->Status );
return STATUS_SUCCESS;
} // XsNetCharDevQEnum
NTSTATUS XsNetCharDevQGetInfo ( API_HANDLER_PARAMETERS )
/*++
Routine Description:
This routine handles a call to NetCharDevQGetInfo.
Arguments:
API_HANDLER_PARAMETERS - information about the API call. See XsTypes.h for details.
Return Value:
NTSTATUS - STATUS_SUCCESS or reason for failure.
--*/
{ PXS_NET_CHAR_DEV_Q_GET_INFO parameters = Parameters; #if 0
NET_API_STATUS status;
LPTSTR nativeQueueName = NULL; // Native parameters
LPTSTR nativeUserName = NULL; LPVOID outBuffer = NULL;
LPBYTE stringLocation = NULL; // Conversion variables
DWORD bytesRequired = 0; LPDESC nativeStructureDesc;
API_HANDLER_PARAMETERS_REFERENCE; // Avoid warnings
//
// Translate parameters, check for errors.
//
if ( XsWordParamOutOfRange( parameters->Level, 0, 1 )) {
Header->Status = (WORD)ERROR_INVALID_LEVEL; goto cleanup; }
XsConvertTextParameter( nativeQueueName, (LPSTR)SmbGetUlong( ¶meters->QueueName ) );
XsConvertTextParameter( nativeUserName, (LPSTR)SmbGetUlong( ¶meters->UserName ) );
IF_DEBUG(CHAR_DEV) { NetpKdPrint(( "XsNetCharDevQGetInfo: header at %lx, " "params at %lx, level %ld\n", Header, parameters, SmbGetUshort( ¶meters->Level ) )); }
//
// Make the local call.
//
status = NetCharDevQGetInfo( NULL, nativeQueueName, nativeUserName, (DWORD)SmbGetUshort( ¶meters->Level ), (LPBYTE *)&outBuffer );
if ( !XsApiSuccess( status )) { IF_DEBUG(API_ERRORS) { NetpKdPrint(( "XsNetCharDevQGetInfo: NetCharDevQGetInfo failed: " "%X\n", status )); } Header->Status = (WORD)status; goto cleanup;
}
//
// Use the requested level to determine the format of the
// data structure.
//
switch ( SmbGetUshort( ¶meters->Level ) ) {
case 0:
nativeStructureDesc = Desc32_chardevQ_info_0; StructureDesc = Desc16_chardevQ_info_0; break;
case 1:
nativeStructureDesc = Desc32_chardevQ_info_1; StructureDesc = Desc16_chardevQ_info_1; break;
}
//
// Convert the structure returned by the 32-bit call to a 16-bit
// structure. The last possible location for variable data is
// calculated from buffer location and length.
//
stringLocation = (LPBYTE)( SmbGetUlong( ¶meters->Buffer ) + SmbGetUshort( ¶meters->BufLen ) );
status = RapConvertSingleEntry( outBuffer, nativeStructureDesc, FALSE, (LPBYTE)SmbGetUlong( ¶meters->Buffer ), (LPBYTE)SmbGetUlong( ¶meters->Buffer ), StructureDesc, TRUE, &stringLocation, &bytesRequired, Response, NativeToRap );
if ( status != NERR_Success ) { IF_DEBUG(ERRORS) { NetpKdPrint(( "XsCharDevQGetInfo: RapConvertSingleEntry failed: " "%X\n", status )); }
Header->Status = NERR_InternalError; goto cleanup; }
IF_DEBUG(CHAR_DEV) { NetpKdPrint(( "32-bit data at %lx, 16-bit data at %lx, %ld BR\n", outBuffer, SmbGetUlong( ¶meters->Buffer ), bytesRequired )); }
//
// Determine return code based on the size of the buffer. If all data
// has fit, try to pack it.
//
if ( !XsCheckBufferSize( SmbGetUshort( ¶meters->BufLen ), StructureDesc, FALSE // not in native format
)) {
IF_DEBUG(ERRORS) { NetpKdPrint(( "XsNetCharDevQGetInfo: Buffer too small.\n" )); } Header->Status = NERR_BufTooSmall;
} else if ( bytesRequired > SmbGetUshort( ¶meters-> BufLen )) {
IF_DEBUG(ERRORS) { NetpKdPrint(( "NetCharDevQGetInfo: More data available.\n" )); } Header->Status = ERROR_MORE_DATA;
} else {
Header->Converter = XsPackReturnData( (LPVOID)SmbGetUlong( ¶meters->Buffer ), SmbGetUshort( ¶meters->BufLen ), StructureDesc, 1 );
}
//
// Set up the response parameters.
//
SmbPutUshort( ¶meters->TotalAvail, (WORD)bytesRequired );
cleanup:
NetApiBufferFree( outBuffer ); NetpMemoryFree( nativeQueueName ); NetpMemoryFree( nativeUserName );
#else
RETURN_CHARDEV_NOT_SUPPORTED; #endif
//
// Determine return buffer size.
//
XsSetDataCount( ¶meters->BufLen, StructureDesc, Header->Converter, 1, Header->Status );
return STATUS_SUCCESS;
} // XsNetCharDevQGetInfo
NTSTATUS XsNetCharDevQPurge ( API_HANDLER_PARAMETERS )
/*++
Routine Description:
This routine handles a call to NetCharDevQPurge.
Arguments:
API_HANDLER_PARAMETERS - information about the API call. See XsTypes.h for details.
Return Value:
NTSTATUS - STATUS_SUCCESS or reason for failure.
--*/
{ #if 0
NET_API_STATUS status;
PXS_NET_CHAR_DEV_Q_PURGE parameters = Parameters; LPTSTR nativeQueueName = NULL; // Native parameters
API_HANDLER_PARAMETERS_REFERENCE; // Avoid warnings
//
// Translate parameters, check for errors.
//
XsConvertTextParameter( nativeQueueName, (LPSTR)SmbGetUlong( ¶meters->QueueName ) );
//
// Make the local call.
//
status = NetCharDevQPurge( NULL, nativeQueueName );
if ( !XsApiSuccess( status )) { IF_DEBUG(ERRORS) { NetpKdPrint(( "XsNetCharDevQPurge: " "NetCharDevQPurge failed: %X\n", status )); } }
cleanup:
NetpMemoryFree( nativeQueueName );
//
// No return data.
//
Header->Status = (WORD)status;
#else
RETURN_CHARDEV_NOT_SUPPORTED; #endif
return STATUS_SUCCESS;
} // XsNetCharDevQPurge
NTSTATUS XsNetCharDevQPurgeSelf ( API_HANDLER_PARAMETERS )
/*++
Routine Description:
This routine handles a call to NetCharDevQPurgeSelf.
Arguments:
API_HANDLER_PARAMETERS - information about the API call. See XsTypes.h for details.
Return Value:
NTSTATUS - STATUS_SUCCESS or reason for failure.
--*/
{ #if 0
NET_API_STATUS status;
PXS_NET_CHAR_DEV_Q_PURGE_SELF parameters = Parameters; LPTSTR nativeQueueName = NULL; // Native parameters
LPTSTR nativeComputerName = NULL;
API_HANDLER_PARAMETERS_REFERENCE; // Avoid warnings
//
// Translate parameters, check for errors.
//
XsConvertTextParameter( nativeQueueName, (LPSTR)SmbGetUlong( ¶meters->QueueName ) );
XsConvertTextParameter( nativeComputerName, (LPSTR)SmbGetUlong( ¶meters->ComputerName ) );
//
// Make the local call.
//
status = NetCharDevQPurgeSelf( NULL, nativeQueueName, nativeComputerName );
if ( !XsApiSuccess( status )) { IF_DEBUG(ERRORS) { NetpKdPrint(( "XsNetCharDevQPurgeSelf: " "NetCharDevQPurgeSelf failed: %X\n", status )); } }
cleanup:
NetpMemoryFree( nativeQueueName ); NetpMemoryFree( nativeComputerName );
//
// No return data.
//
Header->Status = (WORD)status; #else
RETURN_CHARDEV_NOT_SUPPORTED; #endif
return STATUS_SUCCESS;
} // XsNetCharDevQPurgeSelf
NTSTATUS XsNetCharDevQSetInfo ( API_HANDLER_PARAMETERS )
/*++
Routine Description:
This routine handles a call to NetCharDevQSetInfo.
Arguments:
API_HANDLER_PARAMETERS - information about the API call. See XsTypes.h for details.
Return Value:
NTSTATUS - STATUS_SUCCESS or reason for failure.
--*/
{ #if 0
NET_API_STATUS status;
PXS_NET_CHAR_DEV_Q_SET_INFO parameters = Parameters; LPTSTR nativeQueueName = NULL; // Native parameters
LPVOID buffer = NULL; DWORD level;
API_HANDLER_PARAMETERS_REFERENCE; // Avoid warnings
//
// Translate parameters, check for errors.
//
if ( SmbGetUshort( ¶meters->Level ) != 1 ) {
Header->Status = (WORD)ERROR_INVALID_LEVEL; goto cleanup; }
XsConvertTextParameter( nativeQueueName, (LPSTR)SmbGetUlong( ¶meters->QueueName ) );
StructureDesc = Desc16_chardevQ_info_1;
status = XsConvertSetInfoBuffer( (LPBYTE)SmbGetUlong( ¶meters->Buffer ), SmbGetUshort( ¶meters->BufLen ), SmbGetUshort( ¶meters->ParmNum ), FALSE, TRUE, StructureDesc, Desc32_chardevQ_info_1, Desc16_chardevQ_info_1_setinfo, Desc32_chardevQ_info_1_setinfo, (LPBYTE *)&buffer, NULL );
if ( status != NERR_Success ) {
IF_DEBUG(ERRORS) { NetpKdPrint(( "XsNetCharDevQSetInfo: Problem with conversion: " "%X\n", status )); } Header->Status = (WORD)status; goto cleanup;
}
//
// Make the local call.
//
level = SmbGetUshort( ¶meters->ParmNum ); if ( level != 0 ) { level = level + PARMNUM_BASE_INFOLEVEL; } else { level = SmbGetUshort( ¶meters->Level ); }
status = NetCharDevQSetInfo( NULL, nativeQueueName, level, buffer, NULL );
if ( !XsApiSuccess( status )) { IF_DEBUG(ERRORS) { NetpKdPrint(( "XsNetCharDevQSetInfo: NetCharDevQSetInfo failed: " "%X\n", status )); } Header->Status = (WORD)status; goto cleanup; }
//
// No return information for this API.
//
cleanup:
//
// If there is a native 32-bit buffer, free it.
//
NetpMemoryFree( buffer ); NetpMemoryFree( nativeQueueName );
#else
RETURN_CHARDEV_NOT_SUPPORTED; #endif
return STATUS_SUCCESS;
} // XsNetCharDevQSetInfo
|