/*++ 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