如何将char*(char指针)转换为PCSZ?

1 c c++ driver visual-studio kernel-mode

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

我怎样才能做到这一点?

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;    
}
Run Code Online (Sandbox Code Playgroud)

版01:

为了更好地理解这里是如何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);
Run Code Online (Sandbox Code Playgroud)

小智 5

没有什么可以转换的.PCSZ是一个P ointer到Ç onstant 小号特林Ž ERO-终止.所以,这只是const char *.char *可以隐式转换为const char *.

我认为这样的typedef小号可怕的,但不幸的是,微软的API大量使用它们.

  • 它来自黑暗时代 - 人们对预处理器指令和typedef着迷. (5认同)
  • @VTT因为他们隐藏真实的类型**和**他们隐藏了你正在处理指针的事实......根本没有任何收获.替代方法:只是不要引入这样的typedef. (4认同)
  • 它们来自长指针和短指针(以及数据段),记住Window 3(ish)的架构.MS仍然使用它们来实现向后兼容. (4认同)