这是一个自动提取改动代码的工作,更准确的说是设计给EDK2代码使用的。比如,你在一套代码中做出了改动,只要改动文件有相应的注释,工具找到这样的注释标记即可将改动后的文件提取到上一层目录中同样的子目录下。程序会扫描如下文件的内容来检测是否有标记信息 *.c;*.h;*.bat;*.xml;*.txt;*.asl;*.inf;*.dsc;*.fdf;*.bat;*.asm;*.uni;*.vfi。
例如:修改的代码位于 c:\working\bkc26\ 下,代码中的改动用 Tag_SC01,Tag_SC02 这样的进行标记后,选择目录,使用Go 按钮进行分析后,找到的修改后的文件会自动拷贝到 c:\working\labz\目录中。这样将会便于分发给需要者而不用进行全部文件的拷贝。如果拷贝过程中出现错误将会在下方的Memo中显示出来。
另外,我现在正在使用 梅捷 SY-D2700-U3M 的主板,固化了Intel D2700 Atom CPU。具有零噪音(无风扇),节能环保,扩展丰富等等特点。唯一的问题是:经常硬盘丢失。具体是在使用中忽然BSOD,然后自动重启之后在Setup中无法找到硬盘,重启无效,必须关机一次再开机。看起来不像是BIOS问题,并且我确定不是硬盘问题,有谁知道这个问题如何解决可以告诉我。谢谢!
zlib 是一款开源的数据压缩库。很多软件都选用了这款软件来实现自己的功能。开源软件的很大特点就是版本众多,如果你遇到了如下图所示的错误
“The ordinal 55 could not be located in the dynamic link library zlib1.dll”(英文环境)
或者“无法定位序数 55 于动态链接库 zlib1.dll 上”(中文环境)
那么你需要找一个正确的 zlib1.dll 版本放在你运行的程序目录下。此外,还可能遇到 “无法定位序数 73 于动态链接库 zlib1.dll 上” 等等
下载这个 zlib1.dll 包,里面有各种版本,一个个实验总有一款适合你。(“无法定位序数 73”的问题可以使用 1.2.3.2027 版解决)
在 VirtualBox 中安装了一个 Windows XP,结果遇到每次进入桌面就重启动的问题。能够进入“安全模式”。于是用 WinDBG 分析Dump File,结果如下
是 “IntelPPM.sys” 导致的。
在网上搜索 VirtualBox IntelPPM.sys 发现很多人遇到这样的问题。有人建议直接删除这个SYS文件,我试验过并不好用,最后是从安全模式进入,启动注册表
在下面的键值中,将 Start 修改为 4
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Intelppm
再次重启就OK了。
参考:
1.“Problems with Intelppm.sys and processr.sys under Virtual PC / Virtual Server”
http://blogs.msdn.com/b/virtual_pc_guy/archive/2005/10/24/484461.aspx
测试文件生成器
这个工具可以生成指定大小的随机内容文件以供测试。生成的内容是完全没有规律的随机数,压缩软件甚至无法对其进行压缩,是用来测试拷贝等等有力的工具。
使用方法:
fg /s /n /r
/s 指定生成文件的大小,单位是KB
/n 指定生成文件的数量
/r 完全随机内容(每次生成随机内容不同)
例如,fg /s4096 /n10 将会生成10个大小为 4096KB 的文件。
因为是内存直接写入文件的,因此目前的限制大约只能生成最大2G的内容。
===============================================================
2023年10月 在 Windows 下可以直接通过fsutil命令完成相同的工作
fsutil file createnew 文件名 大小
例如:fsutil file createnew test.txt 1024 将会生成一个内容为全 00 的 1024字节的 test.txt文件。
这次使用 SetupDiGetClassDevs 和 SetupDiEnumDeviceInterfaces 函数直接查询系统中的硬盘信息。具体的解释,请参考
http://cutebunny.blog.51cto.com/301216/625577 《windows的磁盘操作之七——获取当前所有的物理磁盘号》 这是非常好的文章。
枚举的结果并非 \\.\PhysicalDriveX 而是类似 \\?\usbstor#disk&ven_adata&prod_usb_flash_drive&rev_1.00#000000000000000922&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} 这样的字符串。(天杀同学指出:这种符号连接,是链接到atapi生成的设备,比如\device\ide\idedeviceP0TTolo-3这种设备上的,这个设备上面会附加\Device\Harddisk0\DR0,应用程序打开\\?\ide#xxxx这个,就和打开\\.\PhysicalDrive0一样了,因为请求在驱动里面都是从上层往下层传递的. )同样可以直接给CreateFile作为参数使用。
另外,这个程序如果直接运行,会出现打印出来上述字符串,然后又显示 “CreateFile() Error: 5”的问题。这个错误表示 “Access denied”.
它是由于在程序中使用CreateFile而没有相应的权限导致的。
程序中使用了很多C语言的变长数组,这在我看起来无比诡异…….
编译中需要加入 lib,具体方式请参考下图
运行结果如下图,可以看到,最后还给出了硬盘号。
这样的方法更精确一些,在很多硬盘的情况下会节省查询的时间,但是和1中的方法相比,复杂度提高了很多倍。
代码如下
// phylist1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <windows.h> #include <stdio.h> #include <conio.h> #include <winioctl.h> #include <setupapi.h> #define MAX_DEVICE 10 #define INTERFACE_DETAIL_SIZE (1024) DEFINE_GUID(GUID_DEVINTERFACE_DISK, 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); /****************************************************************************** * Function: get device path from GUID * input: lpGuid, GUID pointer * output: pszDevicePath, device paths * return: Succeed, the amount of found device paths * Fail, -1 ******************************************************************************/ DWORD GetDevicePath(LPGUID lpGuid, WCHAR **pszDevicePath) { HDEVINFO hDevInfoSet; SP_DEVICE_INTERFACE_DATA ifdata; PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail; DWORD nCount; BOOL result; //get a handle to a device information set hDevInfoSet = SetupDiGetClassDevs( lpGuid, // class GUID NULL, // Enumerator NULL, // hwndParent DIGCF_PRESENT | DIGCF_DEVICEINTERFACE // present devices ); //fail... if (hDevInfoSet == INVALID_HANDLE_VALUE) { fprintf(stderr, "IOCTL_STORAGE_GET_DEVICE_NUMBER Error: %ld\n", GetLastError()); return (DWORD)-1; } pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(INTERFACE_DETAIL_SIZE); if (pDetail == NULL) { return (DWORD)-1; } pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); nCount = 0; result = TRUE; // device index = 0, 1, 2... test the device interface one by one while (result) { ifdata.cbSize = sizeof(ifdata); //enumerates the device interfaces that are contained in a device information set result = SetupDiEnumDeviceInterfaces( hDevInfoSet, // DeviceInfoSet NULL, // DeviceInfoData lpGuid, // GUID nCount, // MemberIndex &ifdata // DeviceInterfaceData ); if (result) { // get details about a device interface result = SetupDiGetDeviceInterfaceDetail( hDevInfoSet, // DeviceInfoSet &ifdata, // DeviceInterfaceData pDetail, // DeviceInterfaceDetailData INTERFACE_DETAIL_SIZE, // DeviceInterfaceDetailDataSize NULL, // RequiredSize NULL // DeviceInfoData ); if (result) { // copy the path to output buffer wcscpy(pszDevicePath[nCount], pDetail->DevicePath); printf("%ws\n", pDetail->DevicePath); nCount++; } } } free(pDetail); (void)SetupDiDestroyDeviceInfoList(hDevInfoSet); return nCount; } /****************************************************************************** * Function: get all present disks' physical number * input: N/A * output: ppDisks, array of disks' physical number * return: Succeed, the amount of present disks * Fail, -1 ******************************************************************************/ DWORD GetAllPresentDisks(DWORD **ppDisks) { WCHAR *szDevicePath[MAX_DEVICE]; // device path DWORD nDevice; HANDLE hDevice; STORAGE_DEVICE_NUMBER number; BOOL result; DWORD readed; WORD i, j; for (i = 0; i < MAX_DEVICE; i++) { szDevicePath[i] = (WCHAR *)malloc(INTERFACE_DETAIL_SIZE); if (NULL == szDevicePath[i]) { for (j = 0; j < i; j++) { free(szDevicePath[i]); } return (DWORD)-1; } } // get the device paths nDevice = GetDevicePath(const_cast<LPGUID>(&GUID_DEVINTERFACE_DISK), szDevicePath); if ((DWORD)-1 == nDevice) { for (i = 0; i < MAX_DEVICE; i++) { free(szDevicePath[i]); } return (DWORD)-1; } *ppDisks = (DWORD *)malloc(sizeof(DWORD) * nDevice); // get the disk's physical number one by one for (i = 0; i < nDevice; i++) { hDevice = CreateFile( szDevicePath[i], // drive to open GENERIC_READ | GENERIC_WRITE, // access to the drive FILE_SHARE_READ | FILE_SHARE_WRITE, //share mode NULL, // default security attributes OPEN_EXISTING, // disposition 0, // file attributes NULL // do not copy file attribute ); if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive { for (j = 0; j < MAX_DEVICE; j++) { free(szDevicePath[j]); } free(*ppDisks); fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError()); return DWORD(-1); } result = DeviceIoControl( hDevice, // handle to device IOCTL_STORAGE_GET_DEVICE_NUMBER, // dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize &number, // output buffer sizeof(number), // size of output buffer &readed, // number of bytes returned NULL // OVERLAPPED structure ); if (!result) // fail { fprintf(stderr, "IOCTL_STORAGE_GET_DEVICE_NUMBER Error: %ld\n", GetLastError()); for (j = 0; j < MAX_DEVICE; j++) { free(szDevicePath[j]); } free(*ppDisks); (void)CloseHandle(hDevice); return (DWORD)-1; } *(*ppDisks + i) = number.DeviceNumber; // printf("%d\n",number.DeviceNumber); (void)CloseHandle(hDevice); } for (i = 0; i < MAX_DEVICE; i++) { free(szDevicePath[i]); } return nDevice; } int _tmain(int argc, _TCHAR* argv[]) { DWORD *pDisk; int t,j; t=GetAllPresentDisks(&pDisk); for (j=0; j<t;j++) { printf("%d \n", *pDisk++); } _getch(); return 0; }
完整代码下载