【问题标题】:How convert char * (char pointer) to PCSZ?如何将 char *(char 指针)转换为 PCSZ?
【发布时间】:2017-08-15 10:55:32
【问题描述】:

我有一个方法,它的强制参数为char*,我想在RtlInitiAnsiString() 之前转换为PCSZ,并在RtlAnsiStringToUnicodeString() 之后将uName 的结果转换为正确的值。

我该怎么做?

NTSTATUS myMethod(char *myName)
{        
    ANSI_STRING aName;
    UNICODE_STRING uName;
    OBJECT_ATTRIBUTES ObjAttr;

    RtlInitAnsiString(&aName, myName);
    status = RtlAnsiStringToUnicodeString(&uName, &aName, TRUE);
    if(!NT_SUCCESS(status))
    {
       DbgPrint("RtlAnsiStringToUnicodeString Error");
       return status;
    }

    InitializeObjectAttributes(&ObjAttr, &uName, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL); 
    // some code here
    //...
    RtlFreeUnicodeString(&uName);
    return status;    
}

第 1 版:

为了更好地理解MyMethod() 在我的内核驱动程序中的使用方式:

struct MyData
{
    ULONG Value[3];
    char *Str1;
    char *Str2;
};

NTSTATUS Function_IRP_DEVICE_CONTROL(PDEVICE_OBJECT pDeviceObject, PIRP Irp)
{
    PIO_STACK_LOCATION pIoStackLocation;
    struct MyData *pData = (struct MyData*) Irp->AssociatedIrp.SystemBuffer;
    pIoStackLocation = IoGetCurrentIrpStackLocation(Irp);
    switch (pIoStackLocation->Parameters.DeviceIoControl.IoControlCode)
    {
        case IOCTL_DATA :
            DbgPrint("IOCTL DATA");
            DbgPrint("%lu \n %lu \n %lu \n %s \n %s", pData->Value[0], pData->Value[1], pData->Value[2], pData->Str1, pData->Str2);
            ...
            break;
    }

...

//////////// Calling MyMethod() //////////////

myMethod(pData->Str1);

【问题讨论】:

  • 不是PCSZ 的别名const char *
  • this 可能重复?
  • 不要太担心那些 MS 命名约定。
  • 如果您显示的myName 的用法是myMethod() 内部的唯一用法,我建议将函数的定义更改为myMethod(const char * myName)
  • 其实可以改成myMethod(char const * const myName),因为指针本身的值也没有被修改。

标签: c++ c visual-studio driver kernel-mode


【解决方案1】:

没有什么可以转换的。 PCSZP 指向 Constant String Zero 终止的指针。所以,它只是const char *char * 可隐式转换为 const char *

我认为这样的typedefs 可怕,但不幸的是,Microsoft API 大量使用它们。

【讨论】:

  • 它来自黑暗时代——人们对预处理器指令和 typedef 着迷。
  • “我认为这样的 typedef 很可怕” 为什么?你能提供更好的选择吗?
  • @VTT 因为它们隐藏了真正的类型并且它们隐藏了你正在处理指针的事实......根本没有任何收获。替代方案:只是不要引入这样的 typedef。
  • @FelixPalmen 老实说,我完全不明白你的意思。类型别名的全部目的是隐藏真实类型,以防止客户端代码显式绑定到某些实现定义的类型。但是不,它们并没有隐藏您正在处理指针的事实,并且实际上详细地描述了您正在处理的确切类型的指针。不,根本不使用 typedef 不是可比的选择。如果没有 typedef,一个类似的替代方案将涉及在每次声明 const char * 时编写类似“指向常量字符串零终止的指针”的注释。
  • 它们来自长指针和短指针(和数据段)的时代,记住 Window 3 的架构(ish)。 MS 仍在使用它们来实现向后兼容性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2017-02-12
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2011-04-12
  • 2011-10-27
相关资源
最近更新 更多