Skip to content

Instantly share code, notes, and snippets.

@purofle
Created July 2, 2025 15:29
Show Gist options
  • Select an option

  • Save purofle/33a81f5b6f4de15bc7f53a2214577c7c to your computer and use it in GitHub Desktop.

Select an option

Save purofle/33a81f5b6f4de15bc7f53a2214577c7c to your computer and use it in GitHub Desktop.
ucrtbase.dll 在 Windows Insider 27881 下逆向的结果
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
double __cdecl pow(double _X,double _Y)
{
ulonglong uVar1;
uint uVar2;
int iVar3;
double dVar4;
longlong lVar5;
double dVar6;
uint uVar7;
ulonglong uVar8;
uint uVar9;
uint uVar10;
int iVar11;
longlong lVar12;
double dVar13;
undefined1 auVar14 [16];
undefined1 auVar15 [16];
undefined1 auVar16 [16];
undefined1 auVar17 [64];
undefined1 auVar18 [64];
undefined1 in_register_00001248 [56];
undefined1 auVar19 [64];
double dVar20;
undefined1 auVar21 [16];
undefined1 auVar22 [16];
undefined1 auVar23 [16];
double dVar24;
double dVar25;
undefined1 auVar26 [16];
undefined1 extraout_var [60];
undefined1 extraout_var_00 [60];
auVar19._8_56_ = in_register_00001248;
auVar19._0_8_ = _Y;
/* 0x800b0 2333 pow */
if (((byte)DAT_18013be70 & 3) != 3) {
dVar13 = (double)FUN_1800a7a60();
return dVar13;
}
lVar12 = 0;
iVar3 = 0;
uVar10 = (uint)((ulonglong)_X >> 0x20);
uVar7 = uVar10 >> 0x14;
uVar2 = (uint)((ulonglong)_Y >> 0x20);
uVar9 = uVar2 >> 0x14;
dVa r13 = _X;
if ((0x7fd < uVar7 - 1) || (0x7f < (uVar9 & 0x7ff) - 0x3be)) {
uVar8 = (longlong)_Y * 2;
if (0xffdffffffffffffe < uVar8 - 1) {
if ((uVar8 == 0) || (dVar13 = _Y, _X == 1.0)) {
if (0xfff0000000000000 < ((ulonglong)dVar13 ^ 0x8000000000000) * 2) goto LAB_180065ff3;
}
else {
uVar1 = (longlong)_X * 2;
if ((0xffe0000000000000 < uVar1) || (0xffe0000000000000 < uVar8)) {
LAB_180065ff3:
return _X + _Y;
}
if (uVar1 != 0x7fe0000000000000) {
if ((uint)(uVar1 < 0x7fe0000000000000) != (uVar2 >> 0x1f ^ 1)) {
return _Y * _Y;
}
return 0.0;
}
}
return 1.0;
}
if (0xffdffffffffffffe < (longlong)_X * 2 - 1U) {
dVar13 = _X * _X;
iVar11 = 0;
if ((((((ulonglong)_X & 0x8000000000000000) != 0) &&
(uVar7 = uVar2 >> 0x14 & 0x7ff, iVar11 = iVar3, uVar7 - 0x3ff < 0x35)) &&
(uVar8 = 1L << ((ulonglong)(0x433 - uVar7) & 0x3f), ((ulonglong)_Y & uVar8 - 1) == 0)) &&
(((ulonglong)_Y & uVar8) != 0)) {
dVar13 = -dVar13;
iVar11 = 1;
}
if ((longlong)_X * 2 != 0) {
if (((ulonglong)_Y & 0x8000000000000000) != 0) {
return 1.0 / dVar13;
}
return dVar13;
}
if (((ulonglong)_Y & 0x8000000000000000) != 0) {
dVar13 = FUN_1800b0740(iVar11);
return dVar13;
}
return dVar13;
}
if (((ulonglong)_X & 0x8000000000000000) != 0) {
uVar7 = uVar2 >> 0x14 & 0x7ff;
if (uVar7 < 0x3ff) {
LAB_180066199:
dVar13 = FUN_1800eb2fc(_X);
return dVar13;
}
if (uVar7 < 0x434) {
uVar8 = 1L << ((ulonglong)(0x433 - uVar7) & 0x3f);
if (((ulonglong)_Y & uVar8 - 1) != 0) goto LAB_180066199;
iVar3 = 2 - (uint)((uVar8 & (ulonglong)_Y) != 0);
}
else {
iVar3 = 2;
}
dVar13 = ABS(_X); // abs(-1.0) == 1.0
uVar7 = uVar10 >> 0x14 & 0x7ff;
lVar12 = 0x80000;
if (iVar3 != 1) {
lVar12 = 0;
}
}
if (0x7f < (uVar9 & 0x7ff) - 0x3be) {
if (dVar13 == 1.0) { // dVar13 == 1.0
return 1.0;
}
if ((uVar9 & 0x7ff) < 0x3be) {
if ((ulonglong)dVar13 < 0x3ff0000000000001) {
return 1.0 - _Y;
}
return _Y + 1.0;
}
if (0x3ff0000000000000 < (ulonglong)dVar13 != uVar9 < 0x800) {
dVar13 = (double)FUN_18006aba0(0);
return dVar13;
}
dVar13 = FUN_1800eb33c(0);
return dVar13;
}
if (uVar7 == 0) {
dVar13 = (double)((longlong)ABS(_X * 4503599627370496.0) + 0xfcc0000000000000);
}
}
if (_Y == 1.0) {
return _X;
}
if (dVar13 == 1.0) {
return _X;
}
uVar7 = (uint)((longlong)dVar13 + 0xc0196aab00000000U >> 0x20);
dVar20 = (double)((int)uVar7 >> 0x14);
lVar5 = (ulonglong)(uVar7 >> 0xd & 0x7f) * 0x20;
auVar26._8_8_ = 0;
auVar26._0_8_ = *(ulonglong *)(&DAT_180104c08 + lVar5);
auVar14._8_8_ = 0;
auVar14._0_8_ = (longlong)dVar13 - ((longlong)dVar13 + 0xc0196aab00000000U & 0xfff0000000000000 );
auVar14 = vfmadd213sd_fma(auVar26,auVar14,ZEXT816(0xbff0000000000000));
dVar13 = dVar20 * 0.6931471805598903 + *(double *)(&DAT_180104c18 + lVar5);
dVar25 = auVar14._0_8_;
dVar24 = dVar25 * -0.5 * dVar25;
auVar15._0_8_ = -dVar24;
auVar15._8_8_ = 0x8000000000000000;
auVar22._8_8_ = 0;
auVar22._0_8_ = dVar25 * -0.5;
auVar14 = vfmadd213sd_fma(auVar22,auVar14,auVar15);
dVar6 = dVar13 + dVar25;
dVar4 = dVar24 + dVar6;
dVar13 = auVar14._0_8_ +
dVar20 * 5.497923018708371e-14 + *(double *)(&DAT_180104c20 + lVar5) +
(dVar13 - dVar6) + dVar25 + (dVar6 - dVar4) + dVar24 +
(((0.7999999995323976 - dVar25 * 0.6666666663487739) +
(dVar25 * 1.0000415263675542 - 1.142909628459501) * dVar24) * dVar24 +
(dVar25 * 0.5000000000000007 - 0.6666666666666679)) * dVar24 * dVar25;
dVar6 = dVar13 + dVar4;
dVar24 = dVar6 * _Y;
auVar16._0_8_ = -dVar24;
auVar16._8_8_ = 0x8000000000000000;
uVar10 = (uint)((ulonglong)dVar24 >> 0x34) & 0x7ff;
auVar23._8_8_ = 0;
auVar23._0_8_ = dVar6;
auVar14 = vfmadd213sd_fma(auVar19._0_16_,auVar23,auVar16);
iVar3 = (int)lVar12;
uVar7 = uVar10;
if (0x3e < uVar10 - 0x3c9) {
if (0x7fffffff < uVar10 - 0x3c9) {
if (iVar3 != 0) {
return -(dVar24 + 1.0);
}
return dVar24 + 1.0;
}
uVar7 = 0;
if (0x408 < uVar10) {
if (((ulonglong)dVar24 & 0x8000000000000000) == 0) {
dVar13 = FUN_1800eb33c(iVar3);
return dVar13;
}
dVar13 = (double)FUN_18006aba0(iVar3);
return dVar13;
}
}
dVar20 = dVar24 * 369.3299304675746 + 103079215104.5;
uVar8 = (ulonglong)dVar20 >> 0x10;
dVar20 = (double)(int)((ulonglong)dVar20 >> 0x10);
dVar13 = (dVar24 - dVar20 * 0.0027076061741126978) + dVar20 * 5.0411407304988844e-14 +
auVar14._0_8_ + ((dVar4 - dVar6) + dVar13) * _Y;
dVar4 = dVar13 * dVar13;
dVar6 = (double)((lVar12 + uVar8 << 0x2c) + *(longlong *)(&DAT_180105cd8 + (uVar8 & 0xff) * 0x1 0))
;
dVar13 = (dVar13 * 0.16666666666665886 + 0.49999999999996786) * dVar4 +
dVar13 + *(double *)(&DAT_180105cd0 + (uVar8 & 0xff) * 0x10) +
(dVar13 * 0.008333335853047663 + 0.04166668084093659) * dVar4 * dVar4;
if (uVar7 == 0) {
if ((uVar8 & 0x80000000) == 0) {
auVar17._0_4_ =
FUN_1800adf9c(((double)((longlong)dVar6 + -0x3f10000000000000) * dVar13 +
(double)((longlong)dVar6 + -0x3f10000000000000)) * 5.486124068793689e+303 );
auVar17._4_60_ = extraout_var;
dVar6 = auVar17._0_8_;
}
else {
dVar6 = (double)((longlong)dVar6 + 0x3fe0000000000000);
dVar4 = dVar6 + dVar6 * dVar13;
auVar21._8_8_ = 0;
auVar21._0_8_ = dVar4;
auVar14 = vandpd_avx(auVar21,_DAT_180108100);
if (auVar14._0_8_ < 1.0) {
auVar14 = vcmpsd_avx(auVar21,ZEXT816(0),1);
auVar14 = vblendvpd_avx(ZEXT816(0x3ff0000000000000),ZEXT816(0xbff0000000000000),auVar14) ;
dVar24 = auVar14._0_8_;
dVar4 = ((dVar6 - dVar4) + dVar6 * dVar13 + (dVar24 - (dVar24 + dVar4)) + dVar4 +
dVar24 + dVar4) - dVar24;
if (dVar4 == 0.0) {
dVar4 = (double)((ulonglong)dVar6 & 0x8000000000000000);
}
}
auVar18._0_4_ = FUN_18006ab68(dVar4 * 2.2250738585072014e-308);
auVar18._4_60_ = extraout_var_00;
dVar6 = auVar18._0_8_;
}
}
else {
dVar6 = dVar13 * dVar6 + dVar6;
}
/* WARNING: Read-only address (ram,0x000180108100) is written */
return dVar6;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment