Archive for 7 月, 2007

货币基金可转换图例

星期二, 31 7 月, 2007

使用招行的银基通转换货币基金成其它基金时,不知道哪些基金之间可以转换。而专业版中的基金功能在转换时只列出可以转换成的基金供选择,很方便,因此为了方便使用银基通转换基金,特将偶常用的可转换基金列表截成图贴在这供参考。

 

驱动开发系列(第一个非WDM实例)

星期四, 5 7 月, 2007

一般来说,不管学习啥第一个实例总是不那么容易跑起来。为了对相关的类型和函数有更深的印象,第一个实例应该全部手工输入,可以参照相关的实例或文档说明。只有通过手工输入所有的代码,在编译不过时不断的比照实例或文档找出问题的产生的原因才能很快的入门。

在看技术文档的过程中最后能马上实践,而且前面的例子最好能跑起来,这样继续后面的阅读才有意义,不然总有那种想实践又不知如何下手的感觉,还有就是看到后面前面的就忘掉了。只有不断的实践才能很快的掌握所学的知识。(对E文也应该如此,只不过本人总是找借口偷懒,所以至今还是马马虎虎)

第一个非WDM实例

 所谓第一个实例,当然是越简单也越好,就象各种开发工具文档中的Hello World工程一样。为了简单而且让驱动能跑起来,我们先实践非WDM的实例,只实践了两个必须的函数:驱动入口函数DriverEntry和驱动卸载函数DeviceUnload。

为了能用VC IDE来开发驱动(以VC6为例,配上Visual Assist X),我们新建一个空的Win32 Console Application,实例名为DrvSample。添加空的DrvSample.h和DrvSample.c文件到工程中,然后我们给Additional include dictionaries添加C:\WINDDK\inc\ddk\w2k(Setting->C/C++->Category<Preprocessor>),在XP系统下或开发WDM项目要修改成对就的目录。

1. DrvSample.h的内容:
#ifndef _DRV_SAMPLE_H_
#define _DRV_SAMPLE_H_

#include <ntddk.h>

#if DBG
#define DRVSAMPLE_KDPRINT(_x_) \
 DbgPrint("DRVSAMPLE.SYS: "); \
 DbgPrint _x_
#else
#define DRVSAMPLE_KDPRINT(_x_)
#endif

#define DRVSAMPLE_DEVICE_NAME_U   L"\\Device\\DRVSAMPLE"
#define DRVSAMPLE_DOS_DEVICE_NAME_U  L"\\DosDevices\\DrvSample"

NTSTATUS
DriverEntry(
   IN PDRIVER_OBJECT pDriverObject,
   IN PUNICODE_STRING pRegistryPath
   );

VOID
DeviceUnload(
    IN PDRIVER_OBJECT pDriverObject
    );

#endif // _DRV_SAMPLE_H_

2. DrvSample.c的内容:
#include "DrvSample.h"

NTSTATUS
DriverEntry(
   IN PDRIVER_OBJECT pDriverObject,
   IN PUNICODE_STRING pRegistryPath
   )
{
 NTSTATUS status;
 PDEVICE_OBJECT pDevObj;
 UNICODE_STRING uniDeviceName;
 UNICODE_STRING uniDosDeviceName;

 DRVSAMPLE_KDPRINT(("DriverEntry Enter\n"));

 RtlInitUnicodeString(&uniDeviceName, DRVSAMPLE_DEVICE_NAME_U);
 status = IoCreateDevice(
  pDriverObject,
  0,
  &uniDeviceName,
  FILE_DEVICE_UNKNOWN,
  0,
  (BOOLEAN)FALSE,
  &pDevObj
  );
 if (!NT_SUCCESS(status))
 {
  return status;
 }

 DbgPrint("DeviceObject %p\n", pDevObj);

 RtlInitUnicodeString(&uniDosDeviceName, DRVSAMPLE_DOS_DEVICE_NAME_U);
 status = IoCreateSymbolicLink(&uniDosDeviceName, &uniDeviceName);
 if (!NT_SUCCESS(status))
 {
  IoDeleteDevice(pDevObj);
  return status;
 }

 pDriverObject->DriverUnload = DeviceUnload;

 DRVSAMPLE_KDPRINT(("DriverEntry Leave\n"));

 return status;
}

VOID
DeviceUnload(
    IN PDRIVER_OBJECT pDriverObject
    )
{
 UNICODE_STRING uniDosDeviceName;
 
 DRVSAMPLE_KDPRINT(("DeviceUnload Leave\n"));
 RtlInitUnicodeString(&uniDosDeviceName, DRVSAMPLE_DOS_DEVICE_NAME_U);
 IoDeleteSymbolicLink(&uniDosDeviceName);
 IoDeleteDevice(pDriverObject->DeviceObject);
 DRVSAMPLE_KDPRINT(("DeviceUnload Leave\n"));
}

3. 在DrvSample.c的同一目录下添加Makefile文件,内容总是:
#
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#

!INCLUDE $(NTMAKEENV)\makefile.def

4. 在DrvSample.c的同一目录下添加Sources文件,内容是:
TARGETNAME=DrvSample
TARGETPATH=obj
TARGETTYPE=DRIVER
SOURCES=DrvSample.c
其中TARGETNAME是要生成的SYS文件名,不包括.sys

5. 用命令行方式编译:
参见驱动开发系列(配置篇)的第5点。

6. 安装:
1) 将编译出得到的DrvSample.sys拷到%windir%\system32\drivers中
2) 往注册表中添加注册项:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DrvSample]
"ErrorControl"=dword:00000001
"Start"=dword:00000001
"Type"=dword:00000001
将上面的代码保存成.reg文件,DrvSample必须与驱动文件名一致。
注意:文档中Start的默认设置是3(Demand),搞得我总是在设备管理器中找不到驱动,试下来才发现设置成1(System)才可以成功安装。需要重新启动机器才能看得到。
Start: 0 - Boot, 1 - System, 2 - Automation, 3 - Demand, 4 - Disabled

7. 测试:
重新启动之后打开设备管理器,在View菜单中选择“显示隐藏设备”,然后在“非即插即用设备”列表中可以看到DrvSample项,双击可以打开属性窗体,切换到Driver而可以启动/停止驱动。在启动/停止驱动时如果运行Dbgview.exe程序就可以看到输出的信息。

万事开头难,完成了第一个可以跑的驱动后,下一步再测试代码就简单多了。

驱动开发系列(配置篇)

星期四, 5 7 月, 2007

因公司项目需要,开始了新的学习历程:使用DDK开发硬件驱动。

虽然在原来公司接触过驱动开发(仅项目维护),但没有亲自动手开发过驱动,所以这次只能通过论坛和资料开始这个历程了。

DDK安装盘和相关资料可以通过电驴客户端搜索得到,驱动开发论坛主要是驱动开发网

首先从《Windows2000设备驱动程序设计指南.pdf》电子影印版着手,由于没有配套光盘,只能自己分析和摸索。通过在虚拟机上不断的安装测试,终于搞定了最简单的非WDM驱动,在此记录一下。

从配置篇开始一系列的驱动开发实践……

配置编

安装完DDK后就开做一些方便开发的环境配置了,假设DDK安装的位置是“C:\WINDDK”。

1. 将DDK的安装位置添加到系统环境变量:DDKROOT=C:\WINDDK,下一步可以使用%DDKROOT%得到DDK的安装位置。

2. 分别给w2k和wxp配置环境设置批处理文件(视环境情况选择配置):
%DDKROOT%\bin\startddk_w2k.bat文件的内容(安装时要选择w2k的头文件部分):
@echo off
call %DDKROOT%\bin\w2k\set2k.bat %DDKROOT% checked
cd /d %1
cmd.exe

%DDKROOT%\bin\startddk_wxp.bat文件的内容(安装时要选择wxp的头文件部分):
@echo off
call %DDKROOT%\bin\setenv.bat %DDKROOT% checked
cd /d %1
cmd.exe

如果想编译free版本可以把checked修改成free,也可以自由发挥改成参数形式。

3. 分别写注册表项添加文件
w2k.reg内容:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\DDK Command\command]
@="\"C:\\WINDDK\\bin\\startddk_w2k.bat\" \"%1\""

wxp.reg的内容:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\DDK Command\command]
@="\"C:\\WINDDK\\bin\\startddk_wxp.bat\" \"%1\""

4. 根据操作系统版本加载不同的reg文件。加载后在资源管理器中右击驱动源码所在的目录选择“DDK_Command”菜单即可进入已经配置好DDK环境的命令行模式。

5. 常用编译驱动的命令是“build -b -w -c -e -f”,用“build -?”可以看到相关选项说明。

现在可以试试去编译%DDKROOT%\src下的各个例子程序了。

好的背景色可以保护眼睛

星期二, 3 7 月, 2007

Windows系统白底黑字看的时间长了眼睛就受不了,尤其是在看电子书或做软件开发时。所以设置合适的背景色不但能保护眼睛,还可以缓解人的精神压力。昨天在看一本PDF格式的电子书时,由于该电子书每一页都是扫描成图片,在选中一页时感觉其选中的背景色很适合眼睛,因此特使用Photoshop找到其RGB值,在此记录一下。

RGB值是153, 193, 218,转换成GIF可以看到其索引值是6:

效果图:

修改背景图方法:
① 右击桌面选择“属性”
② 切换到“外观”页
③ 点“高级”按钮
④ 在“选项”列表中选择“Window”
⑤ 点击右边的“颜色1”按钮
⑥ 在弹出的颜色选择框中选择“其它”按钮
⑦ 在右下角的“红、绿、蓝”分别输入“153, 193, 218”
⑧ 然后一路“确定”回去即可,如下图:

Update:
有朋友推荐新的背景色,据说是眼科专家给出的调节色,分别是:色调85、饱和度90、亮度205,对应的RGB值是:204, 232, 207,如下图: