Path: news.mitre.org!blanket.mitre.org!agate!howland.erols.net!news-peer.gip.net!news.gsl.net!gip.net!demos!news1.relcom.ru!news.nsk.su!tsiren!news.itfs.nsk.su!sky.inp.nsk.su!not-for-mail From: Slava Monich Newsgroups: comp.os.ms-windows.programmer.nt.kernel-mode Subject: Re: Retrieve name of a device object Date: Sat, 01 Nov 1997 01:00:05 -0500 Organization: FTP Software, Inc. Lines: 54 Message-ID: <345AC565.7A71@ftp.com> References: <345a3eb4.11883787@news.iaehv.nl> NNTP-Posting-Host: sky.inp.nsk.su Mime-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 3.0Gold (Win95; I) To: Mark van Velsen Mark van Velsen wrote: > > one of the undocumented ones... Looking into ntoskrnl.exe I noticed > that this function has 4 parameters, probably looking sometime like: > > NTSTATUS ObQueryNameString( > IN PVOID Object, > IN PUNICODE_STRING Name, > IN POBJECT_TYPE ObjectType, > ?? ); > > Anyone an idea? > I have a slightly different interpretation of ObQueryNameString: NTSTATUS ObQueryNameString( PVOID Object, POBJECT_NAME_INFORMATION Info, ULONG Length, PULONG ReturnLength); OBJECT_NAME_INFORMATION is (accidentally?) defined in NTDDK.H and is actually a UNICODE_STRING: typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; Given a device object, this function seems to return its original device name (even though the device may be opened through a symbolic link). At least I was able to translate a COM port device object into \Device\SerialX name. The code looked like this: char Buffer[256]; NTSTATUS ObStatus; ULONG ReturnLength = 0; OBJECT_NAME_INFORMATION * Info = (OBJECT_NAME_INFORMATION *)Buffer; RtlZeroMemory(Info, sizeof(OBJECT_NAME_INFORMATION)); ObStatus = ObQueryNameString( Port->FileObject->DeviceObject, Info, sizeof(Buffer), &ReturnLength); if ( NT_SUCCESS(ObStatus) && ReturnLength ) if ( Info->Name.Length && Info->Name.Buffer ) { TRACE1("Device: %wZ\n",&Info->Name); .......... } Regards, -Slava