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.
327 lines
6.1 KiB
327 lines
6.1 KiB
|
|
/*++
|
|
|
|
Copyright (C) Microsoft Corporation, 1996 - 1999
|
|
|
|
Module Name:
|
|
|
|
Util.hxx
|
|
|
|
|
|
Author:
|
|
|
|
Mario Goertzel [MarioGo]
|
|
|
|
Revision History:
|
|
|
|
MarioGo 1/13/1997 Bits 'n pieces
|
|
|
|
--*/
|
|
|
|
|
|
|
|
#ifdef TRANSPORT_DLL
|
|
|
|
inline
|
|
PVOID __cdecl
|
|
operator new(
|
|
size_t size
|
|
)
|
|
{
|
|
return(I_RpcAllocate(size));
|
|
}
|
|
|
|
inline
|
|
void __cdecl
|
|
operator delete(
|
|
PVOID ptr
|
|
)
|
|
{
|
|
I_RpcFree(ptr);
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
inline
|
|
PVOID __cdecl
|
|
operator new(
|
|
size_t size,
|
|
size_t extra
|
|
)
|
|
{
|
|
return (PVOID) new char[size+extra];
|
|
}
|
|
|
|
inline
|
|
PVOID __cdecl
|
|
operator new(
|
|
size_t size,
|
|
PVOID pPlacement
|
|
)
|
|
{
|
|
return pPlacement;
|
|
}
|
|
|
|
|
|
inline BOOL
|
|
IsNumeric(
|
|
PCHAR String
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Determines if a string is made of only decimal numbers
|
|
|
|
--*/
|
|
{
|
|
while(*String)
|
|
{
|
|
// REVIEW - could subtract and compare - check generated code.
|
|
if ( *String < '0'
|
|
|| *String > '9' )
|
|
{
|
|
return(FALSE);
|
|
}
|
|
String++;
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
inline BOOL
|
|
IsNumeric(
|
|
RPC_CHAR *String
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Determines if a string is made of only decimal numbers
|
|
|
|
--*/
|
|
{
|
|
while(*String)
|
|
{
|
|
// REVIEW - could subtract and compare - check generated code.
|
|
if ( *String < '0'
|
|
|| *String > '9' )
|
|
{
|
|
return(FALSE);
|
|
}
|
|
String++;
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
RPC_STATUS
|
|
EndpointToPortNumber(
|
|
IN RPC_CHAR *endpoint,
|
|
OUT USHORT &port);
|
|
|
|
RPC_STATUS
|
|
EndpointToPortNumberA(
|
|
IN char *endpoint,
|
|
OUT USHORT &port);
|
|
|
|
void
|
|
PortNumberToEndpoint(
|
|
IN USHORT port,
|
|
OUT RPC_CHAR *pEndpoint);
|
|
|
|
void
|
|
PortNumberToEndpointA(
|
|
IN USHORT port,
|
|
OUT char *pEndpoint
|
|
);
|
|
|
|
UCHAR
|
|
HexDigitsToBinary(
|
|
IN UCHAR high,
|
|
IN UCHAR low);
|
|
|
|
char * _cdecl
|
|
RpcStrTok(
|
|
IN char * string,
|
|
IN const char * control,
|
|
IN OUT char ** ppStrPrev
|
|
);
|
|
|
|
DWORD
|
|
UTIL_WaitForSyncIO(
|
|
LPOVERLAPPED lpOverlapped,
|
|
BOOL fAlertable,
|
|
DWORD dwTimeout
|
|
);
|
|
|
|
DWORD
|
|
UTIL_WaitForSyncHTTP2IO(
|
|
IN LPOVERLAPPED lpOverlapped,
|
|
IN HANDLE hEvent,
|
|
IN BOOL fAlertable,
|
|
IN DWORD dwTimeout
|
|
);
|
|
|
|
RPC_STATUS
|
|
UTIL_GetOverlappedResultEx(
|
|
RPC_TRANSPORT_CONNECTION ThisConnection,
|
|
LPOVERLAPPED lpOverlapped,
|
|
LPDWORD lpNumberOfBytesTransferred,
|
|
BOOL fAlertable,
|
|
DWORD dwTimeout
|
|
);
|
|
|
|
RPC_STATUS
|
|
UTIL_GetOverlappedHTTP2ResultEx(
|
|
RPC_TRANSPORT_CONNECTION ThisConnection,
|
|
IN LPOVERLAPPED lpOverlapped,
|
|
IN HANDLE hEvent,
|
|
IN BOOL fAlertable,
|
|
IN DWORD dwTimeout
|
|
);
|
|
|
|
inline RPC_STATUS
|
|
UTIL_GetOverlappedResult(
|
|
RPC_TRANSPORT_CONNECTION ThisConnection,
|
|
LPOVERLAPPED lpOverlapped,
|
|
LPDWORD lpNumberOfBytesTransferred
|
|
)
|
|
{
|
|
return (UTIL_GetOverlappedResultEx(ThisConnection,
|
|
lpOverlapped,
|
|
lpNumberOfBytesTransferred,
|
|
FALSE,
|
|
INFINITE));
|
|
}
|
|
|
|
|
|
FORCE_INLINE
|
|
RPC_STATUS
|
|
UTIL_ReadFile(
|
|
IN HANDLE hFile,
|
|
IN LPVOID lpBuffer,
|
|
IN DWORD nNumberOfBytesToRead,
|
|
OUT LPDWORD lpNumberOfBytesRead,
|
|
IN OUT LPOVERLAPPED lpOverlapped
|
|
)
|
|
{
|
|
LARGE_INTEGER Li;
|
|
NTSTATUS Status;
|
|
|
|
lpOverlapped->Internal = STATUS_PENDING;
|
|
Li.QuadPart = 0;
|
|
|
|
Status = NtReadFile(
|
|
hFile,
|
|
lpOverlapped->hEvent,
|
|
NULL,
|
|
PtrToUlong(lpOverlapped->hEvent) & 1 ? NULL : lpOverlapped,
|
|
(PIO_STATUS_BLOCK)&lpOverlapped->Internal,
|
|
lpBuffer,
|
|
nNumberOfBytesToRead,
|
|
&Li,
|
|
NULL);
|
|
|
|
if (Status == STATUS_PENDING)
|
|
{
|
|
// Shortcut the common path
|
|
return(ERROR_IO_PENDING);
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
*lpNumberOfBytesRead = (ULONG) (lpOverlapped->InternalHigh);
|
|
return(RPC_S_OK);
|
|
}
|
|
|
|
return(RtlNtStatusToDosError(Status));
|
|
}
|
|
|
|
FORCE_INLINE
|
|
RPC_STATUS
|
|
UTIL_WriteFile(
|
|
IN HANDLE hFile,
|
|
IN LPCVOID lpBuffer,
|
|
IN DWORD nNumberOfBytesToWrite,
|
|
OUT LPDWORD lpNumberOfBytesWritten,
|
|
IN OUT LPOVERLAPPED lpOverlapped
|
|
)
|
|
{
|
|
LARGE_INTEGER Li;
|
|
NTSTATUS Status;
|
|
|
|
lpOverlapped->Internal = STATUS_PENDING;
|
|
Li.QuadPart = 0;
|
|
|
|
Status = NtWriteFile(
|
|
hFile,
|
|
lpOverlapped->hEvent,
|
|
NULL,
|
|
PtrToUlong(lpOverlapped->hEvent) & 1 ? NULL : lpOverlapped,
|
|
(PIO_STATUS_BLOCK)&lpOverlapped->Internal,
|
|
(PVOID)lpBuffer,
|
|
nNumberOfBytesToWrite,
|
|
&Li,
|
|
NULL
|
|
);
|
|
|
|
if (Status == STATUS_PENDING)
|
|
{
|
|
// Shortcut the common path
|
|
return(ERROR_IO_PENDING);
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
*lpNumberOfBytesWritten = (ULONG) (lpOverlapped->InternalHigh);
|
|
return(RPC_S_OK);
|
|
}
|
|
|
|
return(RtlNtStatusToDosError(Status));
|
|
}
|
|
|
|
FORCE_INLINE
|
|
RPC_STATUS
|
|
UTIL_WriteFile2(
|
|
IN HANDLE hFile,
|
|
IN LPCVOID lpBuffer,
|
|
IN DWORD nNumberOfBytesToWrite,
|
|
IN OUT LPOVERLAPPED lpOverlapped
|
|
)
|
|
{
|
|
LARGE_INTEGER Li;
|
|
NTSTATUS Status;
|
|
|
|
lpOverlapped->Internal = STATUS_PENDING;
|
|
Li.QuadPart = 0;
|
|
|
|
Status = NtWriteFile(
|
|
hFile,
|
|
lpOverlapped->hEvent,
|
|
NULL,
|
|
PtrToUlong(lpOverlapped->hEvent) & 1 ? NULL : lpOverlapped,
|
|
(PIO_STATUS_BLOCK)&lpOverlapped->Internal,
|
|
(PVOID)lpBuffer,
|
|
nNumberOfBytesToWrite,
|
|
&Li,
|
|
NULL
|
|
);
|
|
|
|
if (Status == STATUS_PENDING)
|
|
{
|
|
// Shortcut the common path
|
|
return(ERROR_IO_PENDING);
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
return(RPC_S_OK);
|
|
}
|
|
|
|
return(RtlNtStatusToDosError(Status));
|
|
}
|
|
|
|
#ifndef ARGUMENT_PRESENT
|
|
#define ARGUMENT_PRESENT(Argument) (Argument != 0)
|
|
#endif // ARGUMENT_PRESENT
|