Я знаю, что это вопрос не раз поднимался но у меня ничего не получается Не ругайте меня пожайлуста, поиском очень хорошо умею пользоваться. Нужно мне приоброзовать \Device\HarddiskVolume1 в нормальный вид, то есть в 'C:\'. Написал я вот такую функцию, Код (Text): ;_name TCHAR '\Device\HarddiskVolume1',0 ;_name TCHAR '\??\C:',0 ;_name TCHAR '\DosDevices\C:',0 proc GetDeviceName local rq 4 ;Trash local .object OBJECT_ATTRIBUTES64 local .hobject dq ? local .str UNICODE_STRING64 local .str2 UNICODE_STRING64 local .buffer rw 1024 int3 mov rdx,_name lea rcx,[.str] call [RtlInitUnicodeString] xor rax,rax mov [.object.Length],sizeof.OBJECT_ATTRIBUTES64 mov [.object.RootDirectory],rax lea rcx,[.str] mov [.object.ObjectName],rcx mov [.object.Attributes],OBJ_CASE_INSENSITIVE mov [.object.SecurityDescriptor],rax mov [.object.SecurityQualityOfService],rax lea r8,[.object] mov rdx,0x2001 lea rcx,[.hobject] call [NtOpenSymbolicLinkObject] mov rax,[.hobject] ret endp вот структуры, Код (Text): OBJ_INHERIT equ 0x00000002 OBJ_PERMANENT equ 0x00000010 OBJ_EXCLUSIVE equ 0x00000020 OBJ_CASE_INSENSITIVE equ 0x00000040 OBJ_OPENIF equ 0x00000080 OBJ_OPENLINK equ 0x00000100 OBJ_KERNEL_HANDLE equ 0x00000200 OBJ_VALID_ATTRIBUTES equ (OBJ_KERNEL_HANDLE + OBJ_OPENLINK + OBJ_OPENIF + OBJ_CASE_INSENSITIVE + OBJ_EXCLUSIVE + OBJ_PERMANENT + OBJ_INHERIT) SYMBOLIC_LINK_QUERY equ 0x0001 STANDARD_RIGHTS_REQUIRED equ 0xF0000 SYMBOLIC_LINK_ALL_ACCESS equ (STANDARD_RIGHTS_REQUIRED + 0x1) struct UNICODE_STRING64 Length dw ? MaximumLength dw ? dd ? Buffer dq ? ends struct OBJECT_ATTRIBUTES64 Length dd ?;ULONG dd ? RootDirectory dq ?;HANDLE ObjectName dq ?;PUNICODE_STRING Attributes dd ?;ULONG dd ? SecurityDescriptor dq ?;PVOID /* type SECURITY_DESCRIPTOR */ SecurityQualityOfService dq ?;PVOID /* type SECURITY_QUALITY_OF_SERVICE */ ends вообщем, вродебы всё правильно, но постоянно выкидывает ошибку! p.s. пишу я это под XP 64 bit. p.s.s. А вообще-то пора уже отдельный раздел создавать WASM.WIN64
Я делаю так: Код (Text): ;<Indy Clerk> .686 .model flat, stdcall option casemap :none include \masm32\include\ntdll.inc .code ConvertVolumeNameToDosName proc uses ebx VolumeName:PUNICODE_STRING, ResultDosName:PULONG Local SymbolicLinkHandle:HANDLE Local DeviceMap:PROCESS_DEVICEMAP_INFORMATION Local ObjAttr:OBJECT_ATTRIBUTES Local DosName:UNICODE_STRING Local DosNameBuffer[4]:BYTE Local LinkName:UNICODE_STRING Local LinkNameBuffer[MAX_PATH]:BYTE _setseh_ invoke ZwQueryInformationProcess, NtCurrentProcess, ProcessDeviceMap, addr DeviceMap, SizeOf PROCESS_DEVICEMAP_INFORMATION, NULL test eax,eax jnz exit_ mov ObjAttr.uLength,SizeOf OBJECT_ATTRIBUTES mov ObjAttr.hRootDirectory,eax mov ObjAttr.pSecurityDescriptor,eax mov ObjAttr.pSecurityQualityOfService,eax mov ObjAttr.pObjectName,OffSet DirectoryName mov ObjAttr.uAttributes,eax invoke ZwOpenDirectoryObject, addr ObjAttr.hRootDirectory, DIRECTORY_QUERY, addr ObjAttr test eax,eax jnz exit_ lea ecx,DosName mov ObjAttr.pObjectName,ecx lea edx,DosNameBuffer mov DosName.Buffer,edx lea eax,LinkNameBuffer mov LinkName.Buffer,eax mov dword ptr DosName,65536*4 or 4 mov LinkName.MaximumLength,MAX_PATH xor ebx,ebx loop_: bt DeviceMap.DriveMap,ebx jnc next_volume_ lea eax,[ebx+'A'+':'*65536] mov dword ptr DosNameBuffer,eax invoke ZwOpenSymbolicLinkObject, addr SymbolicLinkHandle, SYMBOLIC_LINK_QUERY, addr ObjAttr test eax,eax jnz err_open_ invoke ZwQuerySymbolicLinkObject, SymbolicLinkHandle, addr LinkName, NULL push eax invoke ZwClose, SymbolicLinkHandle pop eax test eax,eax jnz next_volume_ invoke RtlCompareUnicodeString, VolumeName, addr LinkName, TRUE test eax,eax jz err_open_ next_volume_: inc ebx cmp ebx,32 jc loop_ mov eax,STATUS_OBJECT_NAME_NOT_FOUND err_open_: push eax invoke ZwClose, ObjAttr.hRootDirectory pop eax .if !Eax mov edx,ResultDosName mov dword ptr [edx],ebx .endif exit_: _endseh_ ret align 16 DirectoryNameWide WCHAR "\","?","?" DirectoryName UNICODE_STRING <SizeOf DirectoryNameWide, SizeOf DirectoryNameWide, OffSet DirectoryNameWide> ConvertVolumeNameToDosName endp end
Думаю ты кстати понимаешь, что преобразование неоднозначно? Открывать ссылку ;_name TCHAR '\Device\HarddiskVolume1',0 бесполезно - это не ссылка. Тут есть вариант как уже написал товарищ выше - перебор всех дисков и сравнивание того, куда они ведут, с \Device\HarddiskVolume1 https://wasm.ru/forum/viewforum.php?id=31
Не для определения полного имени процесса тебе надо это преобразование? Вот ещё: Код (Text): ConvertDosNameToVolumeName proc DosName:ULONG, ResultVolumeName:PUNICODE_STRING Local DosNameUnicode:UNICODE_STRING Local DosNameBuffer[4]:BYTE Local SymbolicLinkHandle:HANDLE Local ObjAttr:OBJECT_ATTRIBUTES _setseh_ xor eax,eax mov ObjAttr.uLength,SizeOf OBJECT_ATTRIBUTES mov ObjAttr.hRootDirectory,eax mov ObjAttr.pSecurityDescriptor,eax mov ObjAttr.pSecurityQualityOfService,eax mov ObjAttr.pObjectName,OffSet DirectoryName mov ObjAttr.uAttributes,eax invoke ZwOpenDirectoryObject, addr ObjAttr.hRootDirectory, DIRECTORY_QUERY, addr ObjAttr test eax,eax jnz exit_ mov edx,DosName lea ecx,DosNameBuffer .if Edx>32 mov eax,STATUS_INVALID_PARAMETER_1 .else add edx,'A' mov DosNameUnicode._Length,4 mov dword ptr [ecx],eax mov word ptr [ecx],dx mov word ptr [ecx+2],':' mov DosNameUnicode.Buffer,ecx lea eax,DosNameUnicode mov DosNameUnicode.MaximumLength,4 mov ObjAttr.pObjectName,eax invoke ZwOpenSymbolicLinkObject, addr SymbolicLinkHandle, SYMBOLIC_LINK_QUERY, addr ObjAttr test eax,eax jnz err_open_ invoke ZwQuerySymbolicLinkObject, SymbolicLinkHandle, ResultVolumeName, NULL push eax invoke ZwClose, SymbolicLinkHandle pop eax .endif err_open_: push eax invoke ZwClose, ObjAttr.hRootDirectory pop eax exit_: _endseh_ ret align 16 DirectoryNameWide WCHAR "\","?","?" DirectoryName UNICODE_STRING <SizeOf DirectoryNameWide, SizeOf DirectoryNameWide, OffSet DirectoryNameWide> ConvertDosNameToVolumeName endp Определить полное символическое имя процесса позволяет ZwQueryInformationProcess, недокументированный инфокласс: Код (Text): ProcessVolumeInformation equ 27 ;=>psapi!GetProcessImageFileName() QueryProcessImageFileName proc uses esi edi ProcessHandle:HANDLE, FileName:PUNICODE_STRING Local Buffer[MAX_PATH]:WCHAR Local DosName:ULONG _setseh_ invoke ZwQueryInformationProcess, ProcessHandle, ProcessVolumeInformation, addr Buffer, MAX_PATH*2, NULL test eax,eax jnz exit_ lea edi,Buffer + SizeOf UNICODE_STRING + 8*2 ;\Device\* mov ax,'\' cld mov ecx,MAX_PATH*2 mov edx,edi repne scasw ;\Device\Floppy0\* mov ecx,edi sub ecx,edx ;Length lea edi,[edi-6] add ecx,8*2 - 2 mov UNICODE_STRING._Length[Buffer],cx mov UNICODE_STRING.MaximumLength[Buffer],cx invoke ConvertVolumeNameToDosName, addr Buffer, addr DosName test eax,eax jnz exit_ mov word ptr [edi+4],NULL mov edx,DosName cld add edx,'A' mov ecx,MAX_PATH*2 or edx,':'*65536 mov dword ptr [edi],edx mov word ptr [edi+4],'\' mov esi,edi ;A:\* repne scasw mov edx,FileName assume edx:PUNICODE_STRING sub edi,esi ;Length .if [edx].MaximumLength<Di mov eax,STATUS_BUFFER_TOO_SMALL .else mov ecx,edi push edi mov [edx]._Length,di shr ecx,2 ;dwords mov edi,[edx].Buffer rep movsd pop ecx and ecx,11b rep movsb .endif exit_: _endseh_ ret QueryProcessImageFileName endp