首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

关于windows内核的一些有关问题

2013-03-21 
关于windows内核的一些问题最近开始学习wind驱动,在张帆那本书上windows驱动开发详解有关Unicode和Ansi

关于windows内核的一些问题

最近开始学习wind驱动,在张帆那本书上<windows驱动开发详解>有关Unicode和Ansi字符串的问题,代码如下
//(1)用RtlInitAnsiString初始化字符串
ANSI_STRING  AnsiString1;
CHAR * string1= "hello";
//初始化ANSI_STRING字符串
RtlInitAnsiString(&AnsiString1,string1);
KdPrint(("AnsiString1:%Z\n",&AnsiString1));//打印hello

string1[0]='H';
string1[1]='E';
string1[2]='L';
string1[3]='L';
string1[4]='O';
//改变string1,AnsiString1同样会导致变化
KdPrint(("AnsiString1:%Z\n",&AnsiString1));//打印HELLO


问题:CHAR *不就是char *的变化吗?在平常用c的时候,是不能修改常量区变量的值的,也就是string1[0]= 'H',这么做是会段错误的,为什么在内核就没有问题了,求高手解释下把!! windows;内核;字符串; c
[解决办法]
程序加载进内存可以通常分为两部分,一部分是代码段,另一部分是数据段,代码段只读,数据段是可以读写的。而常量会被编译进代码而存在代码段中,因此是无法被修改的,和“高人”说的“内存情况”木有关系。

我的意思就是让你去看看是否被别名了,如果别名了string1就指向了AnsiString1变量的地址了,不再是常量的地址。这个函数很可能是个宏!

Linux我比较熟悉,从来不玩Windows这玩意儿。
[解决办法]
VOID
NTAPI
RtlInitAnsiString(IN OUT PANSI_STRING DestinationString,
                  IN PCSZ SourceString)
{
    ULONG DestSize;

    if(SourceString)
    {
        DestSize = strlen(SourceString);
        DestinationString->Length = (USHORT)DestSize;
        DestinationString->MaximumLength = (USHORT)DestSize + sizeof(CHAR);
    }
    else
    {
        DestinationString->Length = 0;
        DestinationString->MaximumLength = 0;
    }

    DestinationString->Buffer = (PCHAR)SourceString;
}
我觉得要看内存的页面属性。

热点排行