Всем привет интересует вопрос как на Native получить темповый путь с рандомным названием файла начал с этого на win api есть ф-я GetTempPath сделал так Код (Text): WCHAR buffer[0x1FF]; UNICODE_STRING szwStr,out_szwStr; RtlInitUnicodeString(&szwStr,L"TEMP"); out_szwStr.Buffer = buffer; out_szwStr.Length = 0x1FF; out_szwStr.MaximumLength = sizeof(buffer); NTSTATUS NtStatus = RtlQueryEnvironmentVariable_U(NULL,&szwStr,&out_szwStr); if(NT_SUCCESS(NtStatus)) { } интерует вопрос с GetTempFileName ? также на сколько я понимаю RtlQueryEnvironmentVariable_U это тоже надстройка есть более глубокое описание ?
RET Код (Text): Peb->ProcessParameters->Environment_U По поводу RtlQueryEnvironmentVariable_U а если в среде нету темпа то она читает с реестра ???
извините но мне не совсем понятно ... вот исходник винды Код (Text): NTSTATUS RtlQueryEnvironmentVariable_U( IN PVOID Environment OPTIONAL, IN PUNICODE_STRING Name, IN OUT PUNICODE_STRING Value ) { NTSTATUS Status; UNICODE_STRING CurrentName; UNICODE_STRING CurrentValue; PWSTR p; PPEB Peb; Status = STATUS_VARIABLE_NOT_FOUND; Peb = NtCurrentPeb(); try { if (ARGUMENT_PRESENT( Environment )) { p = Environment; if (*p == UNICODE_NULL) { leave; } } else { // // Acquire the Peb Lock for the duration while we munge the // environment variable storage block. // RtlAcquirePebLock(); // // Capture the pointer to the current process's environment variable // block. // p = Peb->ProcessParameters->Environment; } #if DBG if (*p == UNICODE_NULL) DbgPrint( "RTL: QEV - Empty Environment being searched: %08x\n", p); else if ((UCHAR)((*p) >> 8) != '\0') DbgPrint( "RTL: QEV - Possible ANSI Environment being searched: %08x\n", p); #endif if ( RtlpEnvironCacheValid && p == Peb->ProcessParameters->Environment ) { if (RtlEqualUnicodeString( Name, &RtlpEnvironCacheName, TRUE )) { // // Names are equal. Always return the length of the // value string, excluding the terminating null. If // there is room in the caller's buffer, return a copy // of the value string and success status. Otherwise // return an error status. In the latter case, the caller // can examine the length field of their value string // so they can determine much memory is needed. // Value->Length = RtlpEnvironCacheValue.Length; if (Value->MaximumLength >= RtlpEnvironCacheValue.Length) { RtlMoveMemory( Value->Buffer, RtlpEnvironCacheValue.Buffer, RtlpEnvironCacheValue.Length ); // // Null terminate returned string if there is room. // if (Value->MaximumLength > RtlpEnvironCacheValue.Length) { Value->Buffer[ RtlpEnvironCacheValue.Length/sizeof(WCHAR) ] = L'\0'; } Status = STATUS_SUCCESS; } else { Status = STATUS_BUFFER_TOO_SMALL; } goto environcachehit; } } // // The environment variable block consists of zero or more null // terminated UNICODE strings. Each string is of the form: // // name=value // // where the null termination is after the value. // if (p != NULL) while (*p) { // // Determine the size of the name and value portions of // the current string of the environment variable block. // CurrentName.Buffer = p; CurrentName.Length = 0; CurrentName.MaximumLength = 0; while (*p) { // // If we see an equal sign, then compute the size of // the name portion and scan for the end of the value. // if (*p == L'=' && p != CurrentName.Buffer) { CurrentName.Length = (USHORT)(p - CurrentName.Buffer)*sizeof(WCHAR); CurrentName.MaximumLength = (USHORT)(CurrentName.Length+sizeof(WCHAR)); CurrentValue.Buffer = ++p; while(*p) { p++; } CurrentValue.Length = (USHORT)(p - CurrentValue.Buffer)*sizeof(WCHAR); CurrentValue.MaximumLength = (USHORT)(CurrentValue.Length+sizeof(WCHAR)); // // At this point we have the length of both the name // and value portions, so exit the loop so we can // do the compare. // break; } else { p++; } } // // Skip over the terminating null character for this name=value // pair in preparation for the next iteration of the loop. // p++; // // Compare the current name with the one requested, ignore // case. // if (RtlEqualUnicodeString( Name, &CurrentName, TRUE )) { // // Names are equal. Always return the length of the // value string, excluding the terminating null. If // there is room in the caller's buffer, return a copy // of the value string and success status. Otherwise // return an error status. In the latter case, the caller // can examine the length field of their value string // so they can determine much memory is needed. // Value->Length = CurrentValue.Length; if (Value->MaximumLength >= CurrentValue.Length) { RtlMoveMemory( Value->Buffer, CurrentValue.Buffer, CurrentValue.Length ); // // Null terminate returned string if there is room. // if (Value->MaximumLength > CurrentValue.Length) { Value->Buffer[ CurrentValue.Length/sizeof(WCHAR) ] = L'\0'; } if ( !Environment || Environment == Peb->ProcessParameters->Environment) { RtlpEnvironCacheValid = TRUE; RtlpEnvironCacheName = CurrentName; RtlpEnvironCacheValue = CurrentValue; } Status = STATUS_SUCCESS; } else { Status = STATUS_BUFFER_TOO_SMALL; } break; } } environcachehit:; } finally { // // If abnormally terminating, assume access violation. // if (AbnormalTermination()) { Status = STATUS_ACCESS_VIOLATION; } // // Release the Peb lock. // if (!ARGUMENT_PRESENT( Environment )) { RtlReleasePebLock(); } } // // Return status. // return( Status ); }
Да ничего она не возьмет, она на входе получает блок окружения, и просто парсит его. О реестре она вообще ничего не знает. А GetTempFileName генерит имя файла и делает GetFileAttributes.
всем спасибо дошло )) тупанул. По поводу GetTempFileName она просто рандумно генериит названия файла ? или там может какая то ф-я есть промежуточная ?
написал такую простенькую ф-ю и не могу понять где ошибка когда отлаживаю все ОК когда просто запускаю экзешник функция слетает не могу понять где собака зарыта Код (Text): BOOL NtGetTempPath(PWCHAR szwInEnvironment, PWCHAR pBuff) { BOOL bRet = FALSE; PPEB pPeb; __asm { push eax mov eax, fs:[0x30] mov [pPeb], eax pop eax } // pointer to process environment int i = 0; BOOL bChecked = FALSE; //RtlEnterCriticalSection((PRTL_CRITICAL_SECTION)pPeb->FastPebLock); PWCHAR Environment = pPeb->ProcessParameters->Environment; // allocate memory PVOID pHeaps[1]; RtlGetProcessHeaps(1,(PVOID*)&pHeaps); if (pHeaps[0] != NULL) { PWCHAR pMem = (PWCHAR)RtlAllocateHeap(pHeaps[0],HEAP_ZERO_MEMORY,0xFF); if (pMem != NULL) { if (*Environment == L'=') { while(*Environment) { while(*Environment && *Environment != L'=') { pMem[i++] = *Environment++; } if (MyStrCmpW(szwInEnvironment,pMem) == 0 ) { Environment++; MyMemCpy(pBuff,Environment,MyStrLenW(Environment)*sizeof(WCHAR)); bChecked = TRUE; bRet = TRUE; } i = 0; if (bChecked == TRUE) break; MyZeroMemory(pMem,MyStrLenW(pMem)*sizeof(WCHAR),0); Environment++; } } RtlFreeHeap(pHeaps[0],HEAP_NO_SERIALIZE,pMem); } } //RtlLeaveCriticalSection((PRTL_CRITICAL_SECTION)pPeb->FastPebLock); return bRet; } ну собственно вызов Код (Text): WCHAR buffer[0xFF]; MyZeroMemory(buffer,sizeof(buffer),0); NtGetTempPath(L"TEMP",buffer); MessageBoxW(0x00,buffer,NULL,0x40);
Делаю с RtlQueryEnvironmentVariable_U все срабатывает на ура ) Код (Text): WCHAR buffer[0xFF]; MyZeroMemory(buffer,sizeof(buffer),0); UNICODE_STRING InUnStr; RtlInitUnicodeString(&InUnStr,L"TEMP"); UNICODE_STRING OutUnStr; OutUnStr.Buffer = buffer; OutUnStr.Length = OutUnStr.MaximumLength = 0xFF; RtlQueryEnvironmentVariable_U(NULL,&InUnStr,&OutUnStr); MessageBoxW(0x00,buffer,NULL,0x40);