153 lines
4.2 KiB
C
153 lines
4.2 KiB
C
/*++
|
|
|
|
Copyright (c) 1991-1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ErrRead.c
|
|
|
|
Abstract:
|
|
|
|
This file contains the RpcXlate code to handle the NetErrorLogRead API.
|
|
|
|
Author:
|
|
|
|
John Rogers (JohnRo) 12-Nov-1991
|
|
|
|
Environment:
|
|
|
|
Portable to any flat, 32-bit environment. (Uses Win32 typedefs.)
|
|
Requires ANSI C extensions: slash-slash comments, long external names.
|
|
|
|
Notes:
|
|
|
|
The logic in this routine is based on the logic in AudRead.c.
|
|
Make sure that you check both files if you find a bug in either.
|
|
|
|
Revision History:
|
|
|
|
12-Nov-1991 JohnRo
|
|
Created.
|
|
20-Nov-1991 JohnRo
|
|
Handle empty log file.
|
|
Added some assertion checks.
|
|
10-Sep-1992 JohnRo
|
|
RAID 5174: event viewer _access violates after NetErrorRead.
|
|
04-Nov-1992 JohnRo
|
|
RAID 9355: Event viewer: won't focus on LM UNIX machine.
|
|
|
|
--*/
|
|
|
|
// These must be included first:
|
|
|
|
#include <windef.h> // IN, DWORD, etc.
|
|
#include <lmcons.h> // NET_API_STATUS, etc.
|
|
#include <lmerrlog.h> // Needed by rxerrlog.h
|
|
|
|
// These may be included in any order:
|
|
|
|
#include <apinums.h> // API_ equates.
|
|
#include <lmapibuf.h> // NetApiBufferFree().
|
|
#include <netdebug.h> // NetpKdPrint(()), FORMAT_ equates.
|
|
#include <remdef.h> // REM16_, REM32_, REMSmb_ equates.
|
|
#include <rx.h> // RxRemoteApi().
|
|
#include <rxerrlog.h> // My prototype, RxpConvertErrorLogArray().
|
|
#include <winerror.h> // NO_ERROR.
|
|
|
|
|
|
|
|
NET_API_STATUS
|
|
RxNetErrorLogRead (
|
|
IN LPTSTR UncServerName,
|
|
IN LPTSTR Reserved1 OPTIONAL,
|
|
IN LPHLOG ErrorLogHandle,
|
|
IN DWORD Offset,
|
|
IN LPDWORD Reserved2 OPTIONAL,
|
|
IN DWORD Reserved3,
|
|
IN DWORD OffsetFlag,
|
|
OUT LPBYTE * BufPtr,
|
|
IN DWORD PrefMaxSize,
|
|
OUT LPDWORD BytesRead,
|
|
OUT LPDWORD TotalBytes
|
|
)
|
|
{
|
|
const DWORD BufSize = 65535;
|
|
NET_API_STATUS Status;
|
|
LPBYTE UnconvertedBuffer;
|
|
DWORD UnconvertedSize;
|
|
|
|
UNREFERENCED_PARAMETER(PrefMaxSize);
|
|
|
|
NetpAssert(UncServerName != NULL);
|
|
NetpAssert(*UncServerName != '\0');
|
|
|
|
*BufPtr = NULL; // set in case of error, and GP fault if necessary.
|
|
|
|
Status = RxRemoteApi(
|
|
API_WErrorLogRead, // API number
|
|
UncServerName,
|
|
REMSmb_NetErrorLogRead_P, // parm desc
|
|
|
|
REM16_ErrorLogReturnBuf, // data desc 16
|
|
REM16_ErrorLogReturnBuf, // data desc 32 (same as 16)
|
|
REMSmb_ErrorLogReturnBuf, // data desc SMB
|
|
|
|
NULL, // no aux desc 16
|
|
NULL, // no aux desc 32
|
|
NULL, // no aux desc SMB
|
|
ALLOCATE_RESPONSE, // flags: not a null session API
|
|
// rest of API's arguments, in 32-bit LM2.x format:
|
|
Reserved1,
|
|
ErrorLogHandle, // log handle (input)
|
|
ErrorLogHandle, // log handle (output)
|
|
Offset,
|
|
Reserved2,
|
|
Reserved3,
|
|
OffsetFlag,
|
|
& UnconvertedBuffer, // buffer (alloc for us)
|
|
BufSize,
|
|
& UnconvertedSize,
|
|
TotalBytes); // total available (approximate)
|
|
if (Status != NO_ERROR) {
|
|
return (Status);
|
|
}
|
|
|
|
if (UnconvertedSize > 0) {
|
|
|
|
NetpAssert( UnconvertedBuffer != NULL );
|
|
|
|
Status = RxpConvertErrorLogArray(
|
|
UnconvertedBuffer, // input array
|
|
UnconvertedSize, // input byte count
|
|
BufPtr, // will be alloc'ed
|
|
BytesRead); // output byte count
|
|
|
|
(void) NetApiBufferFree( UnconvertedBuffer );
|
|
|
|
if (Status != NO_ERROR) {
|
|
*BufPtr = NULL;
|
|
*BytesRead = 0;
|
|
*TotalBytes = 0;
|
|
return (Status);
|
|
}
|
|
|
|
} else {
|
|
|
|
*BytesRead = 0;
|
|
*TotalBytes = 0;
|
|
NetpAssert( *BufPtr == NULL );
|
|
if (UnconvertedBuffer != NULL) {
|
|
(void) NetApiBufferFree( UnconvertedBuffer );
|
|
}
|
|
|
|
}
|
|
|
|
if ( *BytesRead == 0) {
|
|
NetpAssert( *BufPtr == NULL );
|
|
} else {
|
|
NetpAssert( *BufPtr != NULL );
|
|
}
|
|
return (Status);
|
|
|
|
} // RxNetErrorLogRead
|