简体   繁体   English

strtok_s 在 windbg 中返回不正确的数据

[英]strtok_s return incorrect data inside windbg

(Hello Everyone) I have some problem with strtok_s. (大家好)我对 strtok_s 有一些问题。 I wrote this code(x64).我写了这段代码(x64)。

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>


    BOOL TestMD5(CONST WCHAR* MD5_DATABASE_FILE)
    {
    HANDLE  hFile = INVALID_HANDLE_VALUE;
    DWORD   FileSize = 0;
    DWORD   dwReaded = 0;
    PBYTE   pData = NULL;
    BOOL    bRead = FALSE;
    PCHAR   token_string = NULL;
    PCHAR   context = NULL;
    CONST   PCHAR delimeter = "\r\n";

    hFile = CreateFileW(
        MD5_DATABASE_FILE,
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );

    if (hFile == INVALID_HANDLE_VALUE)
    {
        wprintf(L"Can't open md5 database file: ");
        return FALSE;
    }

    FileSize = GetFileSize(hFile, NULL);
    if (FileSize == 0 || FileSize == INVALID_FILE_SIZE)
    {

        CloseHandle(hFile);
        return FALSE;
    }

    pData = (PBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (SIZE_T)FileSize);
    if (pData == NULL)
    {

        CloseHandle(hFile);
        return FALSE;
    }

    bRead = ReadFile(hFile, pData, FileSize, &dwReaded, NULL);
    if (bRead != TRUE || dwReaded != FileSize)
    {

        HeapFree(GetProcessHeap(), 0, pData);
        CloseHandle(hFile);
        return FALSE;
    }


    token_string = (PCHAR)strtok_s(pData, delimeter, &context);
    if (token_string == NULL)
    {

        HeapFree(GetProcessHeap(), 0, pData);
        CloseHandle(hFile);
    return FALSE;
    }

    do {

        printf("%s\n", token_string);

    } while (token_string = (PCHAR)strtok_s(NULL, delimeter, &context));


    HeapFree(GetProcessHeap(), 0, pData);
    CloseHandle(hFile);
    return TRUE;
    }

    int main(void)
    {
    WCHAR* MD5_DATABASE_FILE = L"c:\\md5.txt";

    TestMD5(MD5_DATABASE_FILE);


    }

When I run exe this gives me a incorrect data.当我运行 exe 时,这给了我一个不正确的数据。 Content of md5.txt (DC288E0B39EA16B4E9455F82FF265A67:1213:TestDBG + (\r\n) md5.txt 的内容 (DC288E0B39EA16B4E9455F82FF265A67:1213:TestDBG + (\r\n)

output: output:

D:\repos\TestWindbg\x64\Debug>TestWindbg.exe DC288E0B39EA16B4E9455F82FF265A67:1213:TestDBG áááááááááááááááá D:\repos\TestWindbg\x64\Debug>TestWindbg.exe DC288E0B39EA16B4E9455F82FF265A67:1213:TestDBG áááááááááááááááá

I open exe in windbg and I saw while(token_string) is not NULL after first time.我在windbg中打开exe,第一次看到while(token_string)不是NULL。 But is must?但是是必须的吗?

WinDbg image: " https://i.ibb.co/60nHk5S/Untitled.png " WinDbg 图片:“ https://i.ibb.co/60nHk5S/Untitled.png

What is problem?什么是问题? Thanks for reading谢谢阅读

I just change some types of pData and token_string .我只是更改了某些类型的pDatatoken_string

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>


BOOL TestMD5(CONST WCHAR* MD5_DATABASE_FILE)
{
    HANDLE  hFile = INVALID_HANDLE_VALUE;
    DWORD   FileSize = 0;
    DWORD   dwReaded = 0;
    char*   pData = NULL;
    BOOL    bRead = FALSE;
    char*   token_string = NULL;
    PCHAR   context = NULL;
    CONST   PCHAR delimeter = "\r\n";

    hFile = CreateFileW(
        MD5_DATABASE_FILE,
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );

    if (hFile == INVALID_HANDLE_VALUE)
    {
        wprintf(L"Can't open md5 database file: ");
        return FALSE;
    }

    FileSize = GetFileSize(hFile, NULL);
    if (FileSize == 0 || FileSize == INVALID_FILE_SIZE)
    {

        CloseHandle(hFile);
        return FALSE;
    }

    pData = (char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(SIZE_T)FileSize + 1);
    if (pData == NULL)
    {

        CloseHandle(hFile);
        return FALSE;
    }

    bRead = ReadFile(hFile, pData, FileSize, &dwReaded, NULL);
    if (bRead != TRUE || dwReaded != FileSize)
    {
        HeapFree(GetProcessHeap(), 0, pData);
        CloseHandle(hFile);
        return FALSE;
    }


    token_string = strtok_s(pData, delimeter, &context);
    if (token_string == NULL)
    {

        HeapFree(GetProcessHeap(), 0, pData);
        CloseHandle(hFile);
        return FALSE;
    }

    do {

        printf("%s\n", token_string);

    } while (token_string = strtok_s(NULL, delimeter, &context));


    HeapFree(GetProcessHeap(), 0, pData);
    CloseHandle(hFile);
    return TRUE;
}

int main(void)
{
    WCHAR* MD5_DATABASE_FILE = L"c:\\md5.txt";

    TestMD5(MD5_DATABASE_FILE);

}

Output: DC288E0B39EA16B4E9455F82FF265A67:1213:TestDBG + (\r\n) Output: DC288E0B39EA16B4E9455F82FF265A67:1213:TestDBG + (\r\n)

Jeffrey Shao - MSFT:Thank you for reply but this is not solution(but I changed my code PBYTE TO PCHAR). Jeffrey Shao - MSFT:感谢您的回复,但这不是解决方案(但我将代码 PBYTE 更改为 PCHAR)。 The problem is that strtok_s is a string function for this reason you must add NULL byte after buff.问题是 strtok_s 是一个字符串 function ,因此您必须在 buff 后添加 NULL 字节。 Like HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(SIZE_T)FileSize + 1) #1 for NULL character.HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(SIZE_T)FileSize + 1) #1 代表 NULL 字符。 HeapAlloc alloc buff size:FileSize and +1 For Null... HeapAlloc alloc buff size:FileSize and +1 For Null...

Thanks for blabb and Daniel Sęk:感谢 blabb 和 Daniel Sęk:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM