改动代码提取器

这是一个自动提取改动代码的工作,更准确的说是设计给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问题,并且我确定不是硬盘问题,有谁知道这个问题如何解决可以告诉我。谢谢!

gcs

gcs

解决 zliab1.dll 错误的办法

zlib 是一款开源的数据压缩库。很多软件都选用了这款软件来实现自己的功能。开源软件的很大特点就是版本众多,如果你遇到了如下图所示的错误

“The ordinal 55 could not be located in the dynamic link library zlib1.dll”(英文环境)

ord55

或者“无法定位序数 55 于动态链接库 zlib1.dll 上”(中文环境)

error

那么你需要找一个正确的 zlib1.dll 版本放在你运行的程序目录下。此外,还可能遇到 “无法定位序数 73 于动态链接库 zlib1.dll 上” 等等

下载这个 zlib1.dll 包,里面有各种版本,一个个实验总有一款适合你。(“无法定位序数 73”的问题可以使用 1.2.3.2027 版解决)

zlib1

VirtualBox WinXP 蓝屏问题

在 VirtualBox 中安装了一个 Windows XP,结果遇到每次进入桌面就重启动的问题。能够进入“安全模式”。于是用 WinDBG 分析Dump File,结果如下

virbsod

是 “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的内容。

fg

===============================================================

2023年10月 在 Windows 下可以直接通过fsutil命令完成相同的工作

fsutil file createnew 文件名 大小

例如:fsutil file createnew test.txt 1024 将会生成一个内容为全 00 的 1024字节的 test.txt文件。

又一种枚举当前系统中硬盘的方法(2)

这次使用 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,具体方式请参考下图

setting

运行结果如下图,可以看到,最后还给出了硬盘号。

phy2

这样的方法更精确一些,在很多硬盘的情况下会节省查询的时间,但是和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;
}

 

完整代码下载

Phylist2