如何将 char *(字符指针)转换为 PCSZ?
How convert char * (char pointer) to PCSZ?
我有一个方法,它有一个强制参数 char*
,我想在 RtlInitiAnsiString()
之前转换为 PCSZ
,在 [=16= 之后转换为 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;
}
第 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);
没有可转换的内容。 PCSZ
是 P 到 C 的一个 String Z ero 终止。所以,它只是 const char *
。 char *
可隐式转换为 const char *
.
我认为这样的typedef
可怕,但不幸的是,Microsoft API 大量使用它们。
我有一个方法,它有一个强制参数 char*
,我想在 RtlInitiAnsiString()
之前转换为 PCSZ
,在 [=16= 之后转换为 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;
}
第 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);
没有可转换的内容。 PCSZ
是 P 到 C 的一个 String Z ero 终止。所以,它只是 const char *
。 char *
可隐式转换为 const char *
.
我认为这样的typedef
可怕,但不幸的是,Microsoft API 大量使用它们。