reactos 源码带了一个调试工具fdebug, 这个调试器原本是通过串口来连接reactos,但实际上这种方式很麻烦,必须要有两台机器。比较好的方式就是通过虚拟机用pipe方式来调试,但首先就要修改fdebug的源代码,改为通过pipe来连接,打开rs232.c 文件,找到Rs232OpenPortWin32函数:
- BOOL Rs232OpenPortWin32(TCHAR* CommPort)
- {
- TCHAR PortName[MAX_PATH];
- DWORD ErrorCode;
- // First check and make sure they don't already have the
- // OBD2 connection open. We don't want to open things twice.
- if (hPortHandle != NULL)
- {
- _tprintf(TEXT("Port handle not NULL. Must be already open. Returning FALSE...\n"));
- return FALSE;
- }
- _stprintf(PortName, TEXT("\\\\.\\%s"), CommPort);
- hPortHandle = CreateFile(PortName,
- GENERIC_READ|GENERIC_WRITE,
- 0,
- 0,
- OPEN_EXISTING,
- 0,
- 0);
- if (hPortHandle == INVALID_HANDLE_VALUE)
- {
- hPortHandle = NULL;
- ErrorCode = GetLastError();
- _tprintf(TEXT("CreateFile(\"%s\") failed. GetLastError() = %lu.\n"), PortName, ErrorCode);
- return FALSE;
- }
- return TRUE;
- }
这儿可以把PortName 改为\\\.\\pipe\com1;
然后在fdebug.c 的Rs232Thread函数处:
- VOID Rs232Thread(VOID* Parameter)
- {
- BYTE Byte;
- TCHAR String[MAX_PATH];
- MSG msg;
- DWORD dwNumberOfBytesWritten;
- UNREFERENCED_PARAMETER(Parameter);
- dwThreadId = GetCurrentThreadId();
- if (!Rs232OpenPortWin32(strComPort))
- {
- MessageBox(hMainWnd, TEXT("Error opening port!"), TEXT("Error"), MB_OK|MB_ICONSTOP);
- bConnected = FALSE;
- return;
- }
- //_stprintf(String, TEXT("%s,n,8,1"), strBaudRate); 注释掉这儿
- //if (!Rs232ConfigurePortWin32(String))
- //{
- // MessageBox(hMainWnd, TEXT("Error configuring port!"), TEXT("Error"), MB_OK|MB_ICONSTOP);
- // bConnected = FALSE;
- // return;
- //} 注释掉这儿
- while (bConnected)
- {
- if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- {
- if (msg.message == WM_CHAR)
- {
- Rs232WriteByteWin32((BYTE)msg.wParam);
- if (bLocalEcho && msg.wParam != (WPARAM)TEXT('\r'))
- {
- PostMessage(hDisplayWnd, WM_CHAR, (WPARAM)msg.wParam, (LPARAM)0);
- if (hCaptureFile)
- {
- WriteFile(hCaptureFile, &msg.wParam, sizeof(TCHAR), &dwNumberOfBytesWritten, NULL);
- }
- }
- }
- }
- if (Rs232ReadByteWin32(&Byte))
- {
- _stprintf(String, TEXT("%c"), Byte);
- PostMessage(hDisplayWnd, WM_CHAR, (WPARAM)String[0], (LPARAM)0);
- if (hCaptureFile)
- {
- WriteFile(hCaptureFile, &String[0], sizeof(TCHAR), &dwNumberOfBytesWritten, NULL);
- }
- }
- }
- dwThreadId = 0;
- Rs232ClosePortWin32();
- }
注释掉对 Rs232ConfigurePortWin32() 的调用。因为对pipe来说,是不用配置这样的参数的,然后就可以编译了。
默认情况下,fdebug并不会编译的(看来reactos本身是想淘汰掉这种调试工具,因为现在有了其他调试工具ReactosDBG)
打开freeldr目录下的freeldr.rebuild,增加如下的命令:
<directory name="fdebug">
<xi:include href="fdebug/fdebug.rbuild" />
</directory>
保存退出,在编译环境下执行:
make freeldr_fdebug
这样就可以用了