#include #include #include #define BOOT_SECTOR_SIZE 512 BOOLEAN WINAPI PassThruDllEntry( IN HINSTANCE DllHandle, IN DWORD Reason, IN LPVOID Reserved ) /*++ Routine Description: Main DLL entrypoint Arguments: DllHandle - Supplies the DLL handle. Reason - Supplies the call reason Return Value: TRUE if successful FALSE if unsuccessful --*/ { switch ( Reason ) { case DLL_PROCESS_ATTACH: // DLL is attaching to the address // space of the current process. break; case DLL_THREAD_ATTACH: // A new thread is being created in the current process. break; case DLL_THREAD_DETACH: // A thread is exiting cleanly. break; case DLL_PROCESS_DETACH: // The calling process is detaching // the DLL from its address space. break; } return(TRUE); } DWORD WINAPI TestDllGetBootSector( IN LPSTR DeviceName, IN LPSTR ContextStr, OUT PVOID OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned ) { HANDLE hDisk = NULL; DWORD dwStatus = NO_ERROR; UNREFERENCED_PARAMETER( ContextStr ); if ( !DeviceName || !OutBuffer || !BytesReturned ) { dwStatus = ERROR_INVALID_PARAMETER; goto FnExit; } if ( OutBufferSize < BOOT_SECTOR_SIZE ) { *BytesReturned = BOOT_SECTOR_SIZE; dwStatus = ERROR_MORE_DATA; goto FnExit; } // // Open a handle to the disk drive. // hDisk = CreateFile( DeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0, // No security attributes OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL // No template file ); if ( INVALID_HANDLE_VALUE == hDisk ) { dwStatus = GetLastError(); goto FnExit; } // // Clear out the array holding the boot sector. // ZeroMemory( OutBuffer, BOOT_SECTOR_SIZE ); // // Read the boot sector. // if ( !ReadFile( hDisk, OutBuffer, BOOT_SECTOR_SIZE, BytesReturned, NULL ) ) { dwStatus = GetLastError(); goto FnExit; } if ( *BytesReturned != BOOT_SECTOR_SIZE ) { dwStatus = ERROR_BAD_LENGTH; goto FnExit; } FnExit: if ( hDisk ) { CloseHandle( hDisk ); } return dwStatus; } // TestDllGetBootSector DWORD WINAPI TestDllReturnContextAsError( IN LPSTR DeviceName, IN LPSTR ContextStr, OUT PVOID OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned ) { DWORD dwStatus = NO_ERROR; UNREFERENCED_PARAMETER( DeviceName ); UNREFERENCED_PARAMETER( OutBuffer ); UNREFERENCED_PARAMETER( OutBufferSize ); if ( !BytesReturned ) { dwStatus = ERROR_INVALID_PARAMETER; goto FnExit; } *BytesReturned = 0; // // Convert context string to a DWORD value. Note that // strtol will return zero if it can't convert the string. // Zero happens to be NO_ERROR. // dwStatus = strtol( ContextStr, NULL, 10 ); FnExit: return dwStatus; } // TestDllReturnContextAsError DWORD WINAPI TestDllNotEnoughParms( IN LPSTR DeviceName ) { // // This routine _should_ fail and possibly cause a stack exception. // UNREFERENCED_PARAMETER( DeviceName ); return NO_ERROR; } // TestDllNotEnoughParms DWORD WINAPI TestDllTooManyParms( IN LPSTR DeviceName, IN LPSTR ContextStr, OUT PVOID OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned, IN PVOID Nada1, IN PVOID Nada2, IN PVOID Nada3 ) { // // This routine _should_ fail and possibly cause a stack exception. // UNREFERENCED_PARAMETER( DeviceName ); UNREFERENCED_PARAMETER( ContextStr ); UNREFERENCED_PARAMETER( OutBuffer ); UNREFERENCED_PARAMETER( OutBufferSize ); UNREFERENCED_PARAMETER( BytesReturned ); UNREFERENCED_PARAMETER( Nada1 ); UNREFERENCED_PARAMETER( Nada2 ); UNREFERENCED_PARAMETER( Nada3 ); return NO_ERROR; } // TestDllTooManyParms DWORD WINAPI TestDllCauseException( IN LPSTR DeviceName, IN LPSTR ContextStr, OUT PVOID OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned ) { DWORD x = 0; DWORD y; UNREFERENCED_PARAMETER( DeviceName ); UNREFERENCED_PARAMETER( ContextStr ); UNREFERENCED_PARAMETER( OutBuffer ); UNREFERENCED_PARAMETER( OutBufferSize ); UNREFERENCED_PARAMETER( BytesReturned ); // // How about divide by zero? // y = 7 / x; return NO_ERROR; } // CauseException