Denning
驱动牛犊
驱动牛犊
  • 注册日期2002-02-07
  • 最后登录2004-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1763回复:4

Ndis中访问注册表之问题..., 救命!

楼主#
更多 发布于:2002-11-05 13:58
各位! 大家好!
有一个问题请教, 我在 ndis minitport driver 中的MiniprotInitialize 访问注册表, 来读mac address, 每次都读不正确, 是何道理?? 是这样的一种情况, 我
在系统启动时基本上每次都读不到注册表, 或者读得不正确.

但是在系统启动好之后, 把设备进行停用再启用, 这样一定可以获得mac address.

我用 xp, driver是虚拟网卡...
使用ds2.6 的框架, win2k ddk 来编译的...

我是用的以下方式来访问注册表...

NTSTATUS
ZwCFOpenAndReadFile(
PUNICODE_STRING fileName, unsigned char *macphy
)
/*++

Routine Description:

    This routine opens a file for future mapping and reads its contents
    into allocated memory.

Arguments:

    fileName - The name of the file

Return Value:

    STATUS_INSUFFICIENT_RESOURCES if not enough memory for filename
         or fileimage buffer, or
    STATUS_NO_SUCH_FILE if the file cannot be opened,
    STATUS_UNSUCCESSFUL if the length of the read file is 1, or if the
         file cannot be read.
                        
    STATUS_SUCCESS otherwise.

--*/
{
   NTSTATUS ntStatus, Status;
   OBJECT_ATTRIBUTES ObjectAttributes;
   PWCHAR PathPrefix = L\"\\\\REGISTRY\\\\MACHINE\\\\SOFTWARE\\\\MST Tech\\\\MST IP System\";
   HANDLE  KeyHandle;
   ULONG keyValueLength;
   ULONG Value;
   PKEY_VALUE_FULL_INFORMATION infoValueBuffer;
   unsigned char *pData, MacTemp[64];
   unsigned short   i, j;
   UNICODE_STRING unicodeString;
   ANSI_STRING AnsiString;
   ULONG AnsiLength;

   RtlInitUnicodeString(&unicodeString, PathPrefix);
   TRACE(\"Attempting to open\\n%wZ\\n\", &unicodeString);
   InitializeObjectAttributes ( &ObjectAttributes,
                                &unicodeString,
                                OBJ_CASE_INSENSITIVE,
                                NULL,
                                NULL );

   ntStatus = ZwOpenKey( &KeyHandle, KEY_READ, &ObjectAttributes );
   if ( !NT_SUCCESS( ntStatus ) )
   {
   TRACE(\"ZwOpenKey failed.\\n\");
return STATUS_UNSUCCESSFUL;
   }

    RtlInitUnicodeString( &unicodeString, L\"MAC Address\" );
    ntStatus = ZwQueryValueKey( KeyHandle,
                              &unicodeString,
                              KeyValueFullInformation,
                              (PVOID) NULL,
                              0,
                              &keyValueLength );
    if (ntStatus != STATUS_BUFFER_OVERFLOW &&
        ntStatus != STATUS_BUFFER_TOO_SMALL) {
   ZwClose( KeyHandle );
        return ntStatus;
    }
TRACE(\"keyValueLength==%d\\n\", keyValueLength);
    //
    // Allocate a buffer large enough to contain the entire key data value.
    //
    infoValueBuffer = (struct _KEY_VALUE_FULL_INFORMATION *)ExAllocatePool( NonPagedPool, keyValueLength );
    if (!infoValueBuffer) {
  ZwClose( KeyHandle );
       return STATUS_INSUFFICIENT_RESOURCES;
    }

    //
    // Query the data for the key value.
    //
    ntStatus = ZwQueryValueKey( KeyHandle,
                              &unicodeString,
                              KeyValueFullInformation,
                              infoValueBuffer,
                              keyValueLength,
                              &keyValueLength );
    if (!NT_SUCCESS( ntStatus )) {
        ExFreePool( infoValueBuffer );
   ZwClose( KeyHandle );
        return ntStatus;
    }
TRACE(\"infoValueBuffer.DataOffset=%d\\n\", infoValueBuffer->DataOffset );
TRACE(\"infoValueBuffer.DataLength=%d\\n\", infoValueBuffer->DataLength);
if ( 0x1a != infoValueBuffer->DataLength )
{
TRACE(\"DataLength error.\\n\");
        ExFreePool( infoValueBuffer );
   ZwClose( KeyHandle );
return STATUS_UNSUCCESSFUL;
}

// Convert the Unicode filename to Ansi
AnsiLength = infoValueBuffer->DataLength/sizeof(WCHAR);
TRACE(\"AnsiLength=%d\\n\", AnsiLength);
AnsiString.Buffer = (PCHAR)ExAllocatePool( NonPagedPool, AnsiLength+1 );

if (AnsiString.Buffer == NULL)
{
TRACE(\"Insuffient memeory for allocate AnsiString...\\n\");
        ExFreePool( infoValueBuffer );
ZwClose( KeyHandle );
return STATUS_INSUFFICIENT_RESOURCES;
}

AnsiString.MaximumLength = (unsigned short)(AnsiLength+1);
RtlZeroMemory(AnsiString.Buffer, AnsiLength+1);

RtlInitUnicodeString(&unicodeString, (PWCHAR)((PUCHAR)infoValueBuffer + infoValueBuffer->DataOffset));
ntStatus = RtlUnicodeStringToAnsiString(
&AnsiString,
&unicodeString,
FALSE);

if ( !NT_SUCCESS(ntStatus) )
{
        ExFreePool( infoValueBuffer );
ExFreePool( AnsiString.Buffer );
ZwClose( KeyHandle );
return ntStatus;
}

pData = (unsigned char*)AnsiString.Buffer;
for (i=0; i<AnsiString.Length; i++) {
if ( 0 == HexStrToLong((char*)&pData, sizeof(UCHAR), (USHORT*)&MacTemp) ) {
TRACE(\"!!!!!!!  Sorry, I can\'t belive the parameter is correct.\\n\");
}
else {
TRACE(\"Value[%d]==%d==0x%x\\n\", i, (UCHAR)MacTemp, (UCHAR)MacTemp);
}
}

j = 0;
for (i=0; i<AnsiString.Length; i+=2)
{
Value = (MacTemp<<4)+MacTemp[i+1];
macphy[j++] = (UCHAR)Value;
TRACE(\"macphy[%d]==%d==0x%x 0x%02x\\n\", j, macphy[j], macphy[j], Value);
}
macphy[j] = \'\\0\';
TRACE(\"j==%d\\n\", j);

ZWCFErr:
ExFreePool( AnsiString.Buffer );
ExFreePool( infoValueBuffer );
    ZwClose( KeyHandle );
    return ntStatus;
}

请各位指教, 非常感谢!

最新喜欢:

zackaryzackar...
未之思也 夫何远之有? --------------------
Denning
驱动牛犊
驱动牛犊
  • 注册日期2002-02-07
  • 最后登录2004-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-05 21:09
可能是大家都不习惯看有臭有长的代码吧! 反正没人回应...
那我这里简化一下, 我在 Miniportinitilize 中读取 指定的键值的 mac address, 采用 wdm 方式的 ZwOpenKey ZwQueryValueKey...之类. 当然具体的代码如前面, 他实际是DDK的例子., 他是可以工作的. (9999 纯金保证可以工作)

现在是这样的情况, 设备启动时老是不能获得, 不能读到注册的键值
我也不知道错在哪里. 我的怀疑是不是ndis启动时 注册表还没有load 进内存. 或者其他原因.

但是在系统启动好之后, 把设备进行停用再启用, 这样一定可以获得mac address.

简直没有天理!!

当然我不能采用NdisReadConfiguration之类的东东, 因为该mac address 也要其他程序来访问的. 而Network driver 安装时注册的路径太复杂了, 所以该法不可行. 我的其他应用程序很难访问.

谢谢各位的意见.
未之思也 夫何远之有? --------------------
gjpland
驱动小牛
驱动小牛
  • 注册日期2001-09-13
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-06 09:08
可能是大家都不习惯看有臭有长的代码吧! 反正没人回应...
那我这里简化一下, 我在 Miniportinitilize 中读取 指定的键值的 mac address, 采用 wdm 方式的 ZwOpenKey ZwQueryValueKey...之类. 当然具体的代码如前面, 他实际是DDK的例子., 他是可以工作的. (9999 纯金保证可以工作)

现在是这样的情况, 设备启动时老是不能获得, 不能读到注册的键值
我也不知道错在哪里. 我的怀疑是不是ndis启动时 注册表还没有load 进内存. 或者其他原因.

但是在系统启动好之后, 把设备进行停用再启用, 这样一定可以获得mac address.

简直没有天理!!

当然我不能采用NdisReadConfiguration之类的东东, 因为该mac address 也要其他程序来访问的. 而Network driver 安装时注册的路径太复杂了, 所以该法不可行. 我的其他应用程序很难访问.

谢谢各位的意见.
 

NdisReadNetworkAddress
仔细看一下这个函数会对你有所帮助的。
我思故我在,脑袋不会坏.
Denning
驱动牛犊
驱动牛犊
  • 注册日期2002-02-07
  • 最后登录2004-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-06 10:20
Dear Mr.gjpland:

谢谢你的回复. ^_^
我看过了 NdisReadNetWorkAddress 函数的定义, 他读的是nic安装时所建立的路径. 当然nic driver是可以轻易的访问到, 但是其他应用程序比如说上层的应用程序要得到这个路径比较困难, 可能只能用scan的方式来进行, 而且上层的应用程序还要修改这个值得, 工作量太大. 估计不是优选的方案

另外其实我的mac address的注册路径是在另外的一个地方,  \\\\REGISTRY\\\\MACHINE\\\\SOFTWARE\\\\MST Tech\\\\MST IP System\\Mac Address, 按道理系统启动时应该可以访问. 但实际上这个路径不能访问. 现在我的估计是由于系统安全的影响, 我是用的2000 WXp, 必须要用户登录的, 98不需要登陆, 我没有试. 那么, 由于用户还没有登陆到系统, 实际上在出现 登陆提示框之前, 网卡已经启动, 但没有登陆, 所以没有访问注册表的权限, 因而访问不到我所设的注册表. 这样理解, 不知正确与否? 还望各位指教....
未之思也 夫何远之有? --------------------
Denning
驱动牛犊
驱动牛犊
  • 注册日期2002-02-07
  • 最后登录2004-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-07 14:33
给点小分, 以为大虾辛苦看贴子...

 :cool: :D :)
未之思也 夫何远之有? --------------------
游客

返回顶部